最佳答案
我曾经遇到过这样一种情况(我认为这很奇怪,但可能很正常) : 我使用 EntityManager.getReference (LObjec.getClass () ,LObjec.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: Unknown tity: com.my.persence.L $EnancerByCGLIB $$3e7987d0”
在研究了一段时间之后,我最终发现这是因为我正在使用 EntityManager.getReference ()方法,当该方法返回一个代理时,我得到了上面的异常。
这让我很好奇,什么时候应该使用 EntityManager.getReference ()方法而不是 EntityManager.find ()方法?
GetReference ()如果无法找到正在搜索的实体,则抛出一个 EntityNotFoundException,这本身非常方便。Find ()方法在找不到实体时仅返回 null。
关于事务边界,在我看来,在将新发现的实体传递给新事务之前,您需要使用 find ()方法。如果您使用 getReference ()方法,那么您可能会遇到类似于上述异常的情况。