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

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

public  boolean insert(final Entity entity){ if (em.find(entity.getClass(), entity.getId()) == null) { et.begin(); em.persist(entity); et.commit(); return true; } return false; } 

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

此function已在JPA 2.0中添加。 只需致电:

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

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

看看merge() 。 我自己并没有太多地使用它,但我想

Hibernate有办法做到这一点

 Serializable id = session.getIdentifier(entity); 

但这不是JPA标准。

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

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

 em.persist(entity); et.commit(); int id = entity.getId() 

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

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

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

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

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