Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠保存或更新没有主键的对象_Java_Hibernate_Jpa - Fatal编程技术网

Java 休眠保存或更新没有主键的对象

Java 休眠保存或更新没有主键的对象,java,hibernate,jpa,Java,Hibernate,Jpa,假设我有一个名为Player的类,它是用hibernate持久化的,并且有一个生成的ID和一个复合的自然ID。Player是一个复杂的类,它存储了也有生成ID的其他对象的层次结构 我可以查询json web服务以获取Player的实例。json由Jackson解析,它构建了一个完整的Player对象,除非它没有任何生成的ID。我基本上想对这个播放器实例执行saveOrUpdate 一个选项是通过自然id查询数据库中的玩家对象。如果没有返回对象,则进行保存。否则,手动将播放器对象的所有值及其所有字

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

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

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

我更愿意做的是将生成的ID从数据库对象复制到web服务中的对象,然后对其进行更新。不幸的是,我没能做到这一点。我原以为使用merge就可以了,但我得到一个例外:

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


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

我可以问一下,为什么不让Jackson将生成的Id(我认为是PK)传递给客户端?如果您这样做了,您可以保存或更新来持久化播放器对象

我通过确保Jackson几乎只使用PK、PK和name来处理与其他对象、实体和集合的关系,而这些对象、实体和集合不应该用相同的方法来处理,因此在反序列化时可以使用@JsonSerialize创建链接

这在Hibernate中非常有效——即使我的实体引用了其他实体/集合,我也可以不使用DTO、转换或额外的db访问来执行CRUD操作

比尔,
Jens

试试session.updateobje而不是merge我不太清楚你说的允许Jackson传递生成的Id是什么意思。我无法控制web服务。它向我发送一个多级哈希表,我向根对象添加一个生成的Id,因为否则我必须使用复合键。出于同样的原因,我还向对象中的所有列表/映射添加了一个Id。