查找Hibernate JPA创建的主键

时间:2009-07-28 18:42:07

标签: java hibernate jpa

简短版本:

在Hibernate JPA中执行merge()之后是否有一种简单的方法来获取主键的值?

详细说明:

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

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

Hibernate SessionFactory有方法可以做到这一点: SessionFactory.getClassMetaData()。getIdentifierPropertyName()。从那里我能够让它发挥作用。

谢谢大家!

答案 1 :(得分:0)

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

除此之外,我不知道如何直接了解 元素是什么。

编辑 就像其他人提到的那样,您可能需要一种标准方法 - 这可能是在一个界面上。因此,您可以将类转换为该接口,然后从中获取id。

答案 2 :(得分:-1)

Merge假设您已经拥有持久化实例,它不应该修改您的PK

答案 3 :(得分:-1)

我们有一个应用程序,其中每个实体都有一个Long类型的主键。然后,我们强制所有Entity类实现一个包含单个方法的接口Idable

Long getId();

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

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

答案 4 :(得分:-1)

我的所有持久化类都继承自PersistentObject,后者提供id和version字段。 除了提供getter方法之外,实际上没有其他方法可以获取ID。