Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 Hibernate对选择的对象执行删除操作_Java_Hibernate_Spring_Jpa - Fatal编程技术网

Java Hibernate对选择的对象执行删除操作

Java Hibernate对选择的对象执行删除操作,java,hibernate,spring,jpa,Java,Hibernate,Spring,Jpa,我正面临Hibernate的问题。 我目前的项目是一个小游戏。在这个游戏中,你有一个棋盘,其中有许多字段,每个字段都有一个标记。 我可以在一个空数据库上进行选择,没有任何问题,但如果我将一个对象放入其中,则保存工作不会出现任何异常,之后数据库值看起来很好,我会遇到异常。 Board课程中有趣的部分: @OneToMany(fetch=FetchType.EAGER) @MapKey(name = "point") public Map<Point, Field> getGameMat

我正面临Hibernate的问题。 我目前的项目是一个小游戏。在这个游戏中,你有一个棋盘,其中有许多字段,每个字段都有一个标记。 我可以在一个空数据库上进行选择,没有任何问题,但如果我将一个对象放入其中,则保存工作不会出现任何异常,之后数据库值看起来很好,我会遇到异常。 Board课程中有趣的部分:

@OneToMany(fetch=FetchType.EAGER)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
     return gameMatrix;
}
日志现在显示了以下内容:

Hibernate:将此\uu.id选择为id0\u 2\u0, 这是唯一的类名 uniqueCl3\u 0\u 2\u,此边界维度 作为borderDi4\u 0\u 2\u,此维度为 尺寸0_2_,此类型为类型0_2_, gamematrix2_uu.Board_uID为Board1_u4_u, 字段3\u.id作为gameMatrix2\u 4\u,选择 a11.从a11场开始的点,其中 a11.id=gamematrix2_u2;gamematrix2_2;id为 公式0_4_,字段3_.id为id1_0_, 字段3。点作为点1\u 0, 字段3。令牌id作为令牌3\u 1\u 0, token4_uu0.id为id2_0.1_0,token4_u0.name为 名称2_1_,标记4_。唯一类名称为 uniqueCl4_2_1_,令牌4_。键入为 从左外侧板键入2_1_ 加入棋盘游戏 此ux.id=gamematrix2 ux.Board u id左 外部联接字段3_uuon gamematrix2.gamematrix2.GameMatrixID=field3.id 左外部连接令牌4_uuu打开 字段3_uu.token_uid=token4_u.id

在这之前,它看起来不错,但Hibernate会执行以下操作:

Hibernate: delete from Board_Field where Board_id=?  
Hibernate: insert into Board_Field (Board_id, gameMatrix_id) values (?, ?)
我得到了一个例外:

线程AWT-EventQueue-0中出现异常 org.springframework.dao.InvalidDataAccessApiUsageException: 对象引用未保存的瞬态 实例-保存临时实例 冲洗前:现场;嵌套 例外是 org.hibernate.transientObject异常: 对象引用未保存的瞬态 实例-保存临时实例 冲洗前:现场

我不明白它为什么要做delete语句。 有什么想法吗?
谢谢

在我看来,您正在向Board类中的字段集合添加一个Field对象,但是您必须先保留新的Field对象,您可能正在创建它


因此出现了异常消息:对象引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:Field

我的一个同事也遇到了类似的问题。他现在不是,但这件事与数据库完整性有关

Hibernate似乎对数据库定义了更多的约束。当Hibernate加载一些数据时,它发现数据库中一定不存在某些记录,并试图将其删除

尝试检查是否违反了某些应定义但未定义的外键,并尝试使数据一致。

您需要设置级联属性:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
     return gameMatrix;
}

您还需要覆盖hashCode和Point和Field的equals-让您的IDE Eclipse、NetBeans、IntelliJ使用它们的业务密钥(即不是它们的自动生成ID)为您生成它们。很久以前,这个问题也有类似的问题,尽管这个问题已经得到了回答,但我还是将它发布在这里以供将来参考

基本上,当setter实际上为空时,我遇到了相同的行为,原因是赋值不存在或不正确,或者setter中存在导致其实际上为空的业务逻辑

Guess hibernate首先选择并将数据视为持久性持久性级别缓存,然后在执行脏检查时发现数据已被删除,因为getter不会返回数据,因为它从未设置过,并继续触发删除

我也发了关于它的帖子

只是把它贴在这里供将来参考

问候
Ravindra

之前的交易是否正常关闭?我正在这样做,当我想保存一块板时,我没有得到异常。保存电路板可以工作,数据库中的值也可以。当我想要选择所有板时,我得到了一个例外。
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
     return gameMatrix;
}