Итак, в основном процесс был таким:
class TFacade{
createT(FObj, AObj) {
T TObj = new T();
TObj.setF(FObj);
TObj.setA(AObj); ...
EntityManager.persist(TObj);
...
L LObj = A.getL();
FObj.setL(LObj);
FFacade.editF(FObj);
}
@TransactionAttributeType.REQUIRES_NEW
класс FFacade{
editF(FObj) {
L LObj = FObj.getL();
LObj = EntityManager.getReference(LObj.getClass(), LObj.getId());
...
EntityManager. merge(FObj);
...
FLHFacade.create(FObj, LObj);
}
@TransactionAttributeType.REQUIRED
class FLHFacade{
createFLH(FObj, LObj){
FLH FLHObj = new FLH();
FLHObj.setF(FObj);
FLHObj.setL( LObj);
....
EntityManager.persist(FLHObj);
...
}
Я получил следующее исключение
"java.lang.IllegalArgumentException: Неизвестный объект:
com.my. persistence.L$$EnhancerByCGLIB$$3e7987d0"
После некоторого изучения этого вопроса я наконец понял, что это произошло потому, что я использовал EntityManager .getReference(), что я получал вышеуказанное исключение, поскольку метод возвращал прокси.
Это заставляет меня задуматься, когда целесообразно использовать EntityManager.getReference () вместо метода EntityManager.find()?
Код: Выделить всё
EntityManager.getReference()
Что касается границ транзакции, мне кажется, вам нужно будет использовать метод find() перед передачей вновь найденной сущности в новую транзакцию. Если вы используете метод getReference(), вы, вероятно, окажетесь в ситуации, похожей на мою, с указанным выше исключением.
Подробнее здесь: https://stackoverflow.com/questions/160 ... e-with-jpa