查看任意对象是否为JPA实体的正确方法是什么?

时间:2014-01-20 18:34:18

标签: jpa

javax.persistence.EntityManager#contains(Object) method's documentation说(部分):

  

检查实例是否是属于当前持久性上下文的托管实体实例。   的抛出:   IllegalArgumentException - 如果不是实体

JPA 2.1 specification的第3.1.1节说:

  

IllegalArgumentException以外的EntityManager接口[例如contains(Object)]的方法引发的运行时异常[例如LockTimeoutException]将导致当前事务成为如果持久化上下文已加入该事务,则标记为回滚。

然后,检查一个任意对象(不知道它是否是一个实体,不知道它是否在持久化上下文中)既是一个实体又是一个持久化上下文而不回滚的首选方法是什么?目前的交易?

1 个答案:

答案 0 :(得分:0)

您可以在新交易中检查,这不会影响您当前的交易。


一些通知 这是您上一个问题的一个很好的例子,当我回答说规范的某些部分没有正确制定时。我将举一个例子,它没有任何问题,与规范相矛盾(至少在JBoss 7.1和Hibernate中):

public class EjbServiceBean implement EjbService {

    @PersistenceContext
    private EntityManager em;

    @Override
    public void testTransaction() {

        //this code is in a transaction EJB method
        MyEntity entity = em.find(MyEntity.class, 1L);
        entity.setPeristentField("New Value");

        try {
            em.find(Class.class, 1);//should rollback the transaction
        } catch (Exception e) {
            //simply catching the Exception, so that the CMT transaction is not rolled back by the EJB container.
        }
    //but after the method returns, the entity instance is commited.
    }
}

通过这个例子,我的意思是你可以在实践中使用em.contains()方法来检查一个类是否是一个实体类。

PS:这也在2.0规范中指定。