2010-11-05 70 views
9

有谁知道我怎么能做到这相当于处于休眠:JPA得到实体对象的ID

session.getIdentifier(instance); 

与JPA?

EntityManager有一个包含的方法,但这几乎是它!我写了一些代码,充当实体和存储在会话中的数据之间的转换(而不是仅存储序列化对象,只存储类名和id)。

回答

10

有谁知道我该怎么做的这个休眠与JPA相当于(...)?

JPA 1.0,所以如果你坚持JPA 1.0没有等价物,你必须使用Hibernate的API:获得来自EntityManagerSession和使用Session#getIdentitifier(Object)

例如,与JBoss(是的,getDelegate()not portable):

org.hibernate.Session session = (Session)manager.getDelegate(); 
session.getIdentifier(myEntity); 

如果使用JPA 2.0,然后使用通过PersistenceUnitUtil#getIdentity(Object)作为axtavt建议。但是这在JPA 1.0中不可用。

+0

感谢您的详细解答。非便携式解决方案应该可以很好地作为临时解决方案。 – ishmeister 2010-11-07 12:46:14

16

在JPA 2.0你可以写

em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(instance); 
+0

+1(我正在搜索MetaModel和EntityType的深度,但从来没有想过去查看EntityManagerFactory内部)。 – 2010-11-05 15:01:59

+0

谢谢,我将不得不考虑升级到JPA 2.0。 – ishmeister 2010-11-07 12:45:13