2009-07-28 62 views
0

短版创建的主键:查找Hibernate的JPA

有没有一种简单的方法做一个合并()在休眠JPA后获得主键的值?

详细信息:

我在做一个使用Hibernate的通用库。该库使用JPA的merge()将POJO序列化到数据库。发现主键的新价值的最佳方式是什么?我假设主键永远不会是一个复合键。但是,有些情况下POJO是包含主键的类的子类。所以,在POJO上使用反射并不是一个简单的答案(即有必要反映类和所有超类)。

有什么建议吗?

回答

1

Hibernate SessionFactory具有这样的方法: SessionFactory.getClassMetaData()。getIdentifierPropertyName()。从那里我能够得到它的工作。

谢谢大家!

+0

美丽!谢谢! – 2013-03-16 01:57:39

-1

合并假设你已经拥有持久化实例,它不应该修改你PK

-1

我们有,每一个实体有long类型的主键的应用程序。然后,我们迫使所有的实体类来实现它包含一个方法的接口Idable

Long getId(); 

对于需要ID的通用代码,我们就可以转换为Idable并调用getId()检索主键。

如果你的类可能包含不同类型,你可以使getId()方法的返回Object其中JDK5的Covariant Return Types功能将允许你仍然可以正常使用(即使类声明以返回不同的类型,如Long方法)。在这种情况下,如果类的主键未被调用“id”,则需要将方法实现标记为@Transient,以便Hibernate/JPA不会将其作为单独的属性进行提取。

+0

真的,downvote? 4年后?你可能至少麻烦解释为什么这个答案是*错误*(提示:它不是,即使它可能不适用于*你*) – 2013-03-18 18:01:18

0

您可以查看类(和父类)中的所有方法(或字段),直到找到带有@Id标记的方法(或字段),然后使用该字段从合并的返回结果中获取值呼叫。

除此之外,我不知道有什么方法不知道什么元素是直接。

编辑就像别人提到一个人,你可能需要一个标准方法 - 这可能是一个接口上。因此,您可以将类转换为该接口,然后从中取出id。

-1

我所有的持久化类都从PersistentObject继承,它提供了id和版本字段。 其他提供一个getter方法,真的没有其他方式获得该ID。