我遇到了一种情况(我认为这很奇怪,但可能很正常),在这种情况下,我使用EntityManager.getReference(LObj.getClass(),LObj.getId())获取数据库实体,然后将返回的对象传递给保留在另一个表中。
所以基本上流程是这样的:
TFacade类{
createT(FObj,AObj){
T TObj =新的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
FLHFacade类{
createFLH(FObj,LObj){
FLH FLHObj =新的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()方法,则可能会遇到类似于我的情况,但有上述例外。
郎朗坤
交互式爱情
相关分类