如何获取任何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()方法。