hibernate保存或更新没有主键的对象

时间:2013-11-28 03:19:39

标签: java hibernate jpa

假设我有一个名为Player的类,它使用hibernate持久化,并且同时具有生成的ID和复合自然ID。 Player是一个复杂的类,它存储了同时生成了ID的其他对象的层次结构。

我可以查询json Web服务以获取Player的实例。 json由Jackson解析,它构建一个完整的Player对象,除了它不会有任何生成的ID。我基本上想在这个播放器实例上做一个saveOrUpdate。

一个选项是按照自然ID查询数据库中的Player对象。如果没有返回任何对象,请执行保存。否则,手动将Player对象(及其所有字段)的所有值从Web服务复制到数据库中的对象,然后进行更新。我不喜欢这个选项,因为它似乎效率低下并且会包含很多额外的代码。

我更喜欢做的是将生成的ID从数据库对象复制到Web服务中的对象,然后对其进行更新。不幸的是我无法完成这项工作。我认为使用merge()可以做到这一点,但我得到了这个例外:

org.hibernate.HibernateException:找到了多个具有给定标识符的行

处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我可以问你为什么不让Jackson将生成的Id(我认为是PK)传递给客户?如果你这样做,你可以saveOrUpdate来持久化Player对象。

我通过确保Jackson几乎只使用PK(实际上是PK和名称,因此可以创建链接)来处理与其他对象(不应该由同一方法处理的实体和集合)的关系,使用@JsonSerialize。

Hibernate的工作方式很快 - 即使我的实体引用其他实体/集合,我也可以简单地使用无DTO,转换或额外的数据库访问来进行CRUD操作。

BR, 延