Java 如何获取任何JPA实体的主键?

Java 如何获取任何JPA实体的主键?,java,eclipselink,jpa-2.0,Java,Eclipselink,Jpa 2.0,对于每个@实体,我需要执行以下操作: public <Entity> boolean insert(final Entity entity){ if (em.find(entity.getClass(), entity.getId()) == null) { et.begin(); em.persist(entity); et.commit(); return true; } return fal

对于每个@实体,我需要执行以下操作:

public <Entity> boolean insert(final Entity entity){
    if (em.find(entity.getClass(), entity.getId()) == null) {
        et.begin();
        em.persist(entity);
        et.commit();
        return true;
    }
    return false;
}
公共布尔插入(最终实体){
if(em.find(entity.getClass(),entity.getId())==null){
等开始();
em.persist(实体);
et.commit();
返回true;
}
返回false;
}
也就是说,如果实体不存在,就持久化它,并知道它是否存在。 对于Entity,我试图接触@Entity,尽管我意识到这不是一种继承关系。 我可以使用什么类来引用每个JPA实体?我可以创建一个接口/抽象类MyEntities并让它们全部继承,但这就是方法吗?
我希望代码更少。此外,我希望能够提取每个实体的主键,就像我在.getId()中尝试的那样。

公共接口方法就是我使用的方法,它工作得很好。使用纯JPA,我看不到获取标识符的方法

看看
merge()
。我自己也没怎么用过,但我想

Hibernate有这样做的方法

Serializable id = session.getIdentifier(entity);
但这不是JPA的标准。

阅读一篇关于JPA的文章

我不清楚您的问题,但如果您想获取实体id,请获取它。它在persist方法完成后可用,即

em.persist(entity);
et.commit();
int id = entity.getId()
我通常使用字段
id
及其访问器创建一个类
AbstractEntity
,并从该类继承所有其他实体


这种方法的唯一问题是,如果需要使任何实体可序列化,则必须使
AbstractEntity
可序列化,即所有其他实体都将可序列化。否则,字段
id
将不会在应可序列化的实体中序列化。

此功能是在JPA 2.0中添加的。简单地说:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);

获取实体ID的另一种方法是:

Session session = entityManager.unwrap(Session.class);
Object entityId = session.getId(entity);

此方法使用ObjectBuilder类中的extractPrimaryKeyFromObject()方法

如果您有实体管理器实例:
Object id=em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(实体)