我碰到過一種情況(我認爲這很奇怪,但可能很正常),我使用EntityManager.getReference(LObj.getClass(),LObj .getId())獲取數據庫實體,然後將返回的對象傳遞到另一個表中。什麼時候使用EntityManager.find()vs EntityManager.getReference()
所以基本上流程是這樣的:
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()方法,那麼你可能會以類似於我的情況結束上述例外。
忘了提及,我使用Hibernate作爲JPA提供程序。 – SibzTer 2009-10-22 14:29:56