Java 休眠保存或更新没有主键的对象
假设我有一个名为Player的类,它是用hibernate持久化的,并且有一个生成的ID和一个复合的自然ID。Player是一个复杂的类,它存储了也有生成ID的其他对象的层次结构 我可以查询json web服务以获取Player的实例。json由Jackson解析,它构建了一个完整的Player对象,除非它没有任何生成的ID。我基本上想对这个播放器实例执行saveOrUpdate 一个选项是通过自然id查询数据库中的玩家对象。如果没有返回对象,则进行保存。否则,手动将播放器对象的所有值及其所有字段从web服务复制到数据库中的对象,然后执行更新。我不喜欢这个选项,因为它看起来效率很低,而且会包含很多额外的代码 我更愿意做的是将生成的ID从数据库对象复制到web服务中的对象,然后对其进行更新。不幸的是,我没能做到这一点。我原以为使用merge就可以了,但我得到一个例外: org.hibernate.HibernateException:找到多个具有给定标识符的行Java 休眠保存或更新没有主键的对象,java,hibernate,jpa,Java,Hibernate,Jpa,假设我有一个名为Player的类,它是用hibernate持久化的,并且有一个生成的ID和一个复合的自然ID。Player是一个复杂的类,它存储了也有生成ID的其他对象的层次结构 我可以查询json web服务以获取Player的实例。json由Jackson解析,它构建了一个完整的Player对象,除非它没有任何生成的ID。我基本上想对这个播放器实例执行saveOrUpdate 一个选项是通过自然id查询数据库中的玩家对象。如果没有返回对象,则进行保存。否则,手动将播放器对象的所有值及其所有字
处理这种情况的最佳方法是什么?我可以问一下,为什么不让Jackson将生成的Id(我认为是PK)传递给客户端?如果您这样做了,您可以保存或更新来持久化播放器对象 我通过确保Jackson几乎只使用PK、PK和name来处理与其他对象、实体和集合的关系,而这些对象、实体和集合不应该用相同的方法来处理,因此在反序列化时可以使用@JsonSerialize创建链接 这在Hibernate中非常有效——即使我的实体引用了其他实体/集合,我也可以不使用DTO、转换或额外的db访问来执行CRUD操作 比尔,
Jens试试session.updateobje而不是merge我不太清楚你说的允许Jackson传递生成的Id是什么意思。我无法控制web服务。它向我发送一个多级哈希表,我向根对象添加一个生成的Id,因为否则我必须使用复合键。出于同样的原因,我还向对象中的所有列表/映射添加了一个Id。