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

sim*_*ico 13 java eclipselink jpa-2.0

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

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;
}
Run Code Online (Sandbox Code Playgroud)

如果实体不存在,那就是持久存在,并知道它是否存在.有了实体,我正试图到达@Entity,虽然我意识到这不是继承关系.我可以用什么类来引用每个JPA实体?我可以创建一个接口/抽象类MyEntities并让所有这些继承,但是这样吗?我希望减少代码.此外,当我尝试使用.getId()时,我希望能够提取每个实体的主键.

Gor*_*rke 40

此功能已在JPA 2.0中添加.只需致电:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity);
Run Code Online (Sandbox Code Playgroud)


Rom*_*man 6

阅读有关Generic Dao方法的文章.

我不清楚你的问题,但如果你想获得实体ID - 只需得到它.在持久化方法完成后可用

em.persist(entity);
et.commit();
int id = entity.getId()
Run Code Online (Sandbox Code Playgroud)

我通常AbstractEntity使用字段id及其访问器创建一个类,并继承此类中的所有其他实体.

这种方法的唯一问题是,如果您需要使您的任何实体Serializable,您将不得不进行AbstractEntity序列化,即所有其他实体将变为可序列化.否则,字段id将不会在应该可序列化的实体中序列化.


Mik*_*e Q 5

通用接口方法是我使用的,并且工作正常。使用纯 JPA 我看不到获取标识符的方法。

Have a look at merge(). I've not used it much myself but I think

Hibernate has ways of doing this

Serializable id = session.getIdentifier(entity);
Run Code Online (Sandbox Code Playgroud)

But this is not JPA standard.