短版创建的主键:查找Hibernate的JPA
有没有一种简单的方法做一个合并()在休眠JPA后获得主键的值?
详细信息:
我在做一个使用Hibernate的通用库。该库使用JPA的merge()将POJO序列化到数据库。发现主键的新价值的最佳方式是什么?我假设主键永远不会是一个复合键。但是,有些情况下POJO是包含主键的类的子类。所以,在POJO上使用反射并不是一个简单的答案(即有必要反映类和所有超类)。
有什么建议吗?
短版创建的主键:查找Hibernate的JPA
有没有一种简单的方法做一个合并()在休眠JPA后获得主键的值?
详细信息:
我在做一个使用Hibernate的通用库。该库使用JPA的merge()将POJO序列化到数据库。发现主键的新价值的最佳方式是什么?我假设主键永远不会是一个复合键。但是,有些情况下POJO是包含主键的类的子类。所以,在POJO上使用反射并不是一个简单的答案(即有必要反映类和所有超类)。
有什么建议吗?
Hibernate SessionFactory具有这样的方法: SessionFactory.getClassMetaData()。getIdentifierPropertyName()。从那里我能够得到它的工作。
谢谢大家!
合并假设你已经拥有持久化实例,它不应该修改你PK
我们有,每一个实体有long类型的主键的应用程序。然后,我们迫使所有的实体类来实现它包含一个方法的接口Idable
:
Long getId();
对于需要ID的通用代码,我们就可以转换为Idable
并调用getId()
检索主键。
如果你的类可能包含不同类型,你可以使getId()
方法的返回Object
其中JDK5的Covariant Return Types功能将允许你仍然可以正常使用(即使类声明以返回不同的类型,如Long
方法)。在这种情况下,如果类的主键未被调用“id”,则需要将方法实现标记为@Transient
,以便Hibernate/JPA不会将其作为单独的属性进行提取。
真的,downvote? 4年后?你可能至少麻烦解释为什么这个答案是*错误*(提示:它不是,即使它可能不适用于*你*) – 2013-03-18 18:01:18
您可以查看类(和父类)中的所有方法(或字段),直到找到带有@Id标记的方法(或字段),然后使用该字段从合并的返回结果中获取值呼叫。
除此之外,我不知道有什么方法不知道什么元素是直接。
编辑就像别人提到一个人,你可能需要一个标准方法 - 这可能是一个接口上。因此,您可以将类转换为该接口,然后从中取出id。
我所有的持久化类都从PersistentObject继承,它提供了id和版本字段。 其他提供一个getter方法,真的没有其他方式获得该ID。
美丽!谢谢! – 2013-03-16 01:57:39