2013-11-28 62 views
0

假设我有一个名为Player的类,它持久化为hibernate,并且具有生成的ID和复合自然ID。玩家是一个复杂的类,它存储了也产生了ID的其他对象的层次结构。休眠保存或更新没有主键的对象

我可以查询json的web服务来获取Player的实例。 json被Jackson解析,构建一个完整的Player对象,除了它不会生成任何生成的Ids。我基本上想要在这个播放器的实例上执行saveOrUpdate。

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

我更愿意做的就是将生成的Ids从数据库对象复制到Web服务中的对象,然后对其进行更新。不幸的是,我一直无法完成这项工作。我想用合并()会做的伎俩,但我得到这个异常:

org.hibernate.HibernateException:多行与指定的标识符发现

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

+0

尝试'了Session.update(OBJE)'insted的合并() – jos

回答

0

我可以问你为什么不让杰克逊把生成的ID(我认为是PK)传递给客户端?如果你这样做了,你可以保存或更新来保存Player对象。

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

即使我的实体引用其他实体/集合,我可以简单地使用没有DTO,转换或额外的数据库访问的CRUD操作。

BR, 延

+0

的我真的不知道你的意思是让杰克逊通过生成的ID。我无法控制Web服务。它向我发送了一个多级别的哈希表,并且将一个生成的Id添加到根对象中,否则明智的是我必须使用组合键。出于同样的原因,我还为对象中的所有列表/地图添加了一个Id。 – Sarevok