Я столкнулся с ситуацией (которая, по моему мнению, странная, но вполне нормально), где я использую EntityManager.getReference(LObj.getClass(), LObj.getId()), чтобы получить объект базы данных, а затем передать возвращенный объект сохраняется в другой таблице.
Итак, в основном поток был таким:
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 class 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() выдает исключение EntityNotFoundException, если он не может найти поиск объекта, который очень удобен сам по себе. EntityManager.find() просто возвращает null, если он не может найти объект.
Что касается границ транзакций, для меня звучит так же, как вам нужно будет использовать метод find(), прежде чем передавать вновь найденный объект в новую транзакцию. Если вы используете метод getReference(), вы, вероятно, попадете в ситуацию, похожую на мою, с указанным выше исключением.