java - Hibernate在查询Entity2时自动更新Entity1

标签 java hibernate

我并不期待这个问题的具体答案,因为它太复杂,无法详细解释,只是对问题可能出在哪里的一些指导。

我总结一下,我有一个实体“船舶”,带有实体“出发地”、“目的地”和“国家/地区”的外键。我从数据库中获取一艘船,然后修改其他字段(日期),然后查询数据库中相关的出发地、目的地和国家/地区。当我查询 Origin 和 Country 时,它会按预期进行,但是当我查询 Destination 时,执行 query.getResultList() 时,并在 select a from DESTINATION 之前, Hibernate 自动执行 update SHIP set ... 并设置除 IDN_DEST 之外的所有 Ship 字段。

知道这会发生什么吗?

我的猜测是,由于实体已在 session 中修改,Hibernate 不知何故需要更新它,但仅此而已。

据我所知,Ship.java 中没有差异:

// bi-directional many-to-one association
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDN_ORIGIN", insertable = false, updatable = false)
private Origin tOrigin;

@Column(name = "IDN_ORIGIN")
private Integer idnOrigin;

// bi-directional many-to-one association
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDN_DEST", insertable = false, updatable = false)
private Destination tDest;

@Column(name = "IDN_DEST", updatable = false)
private Integer idnDest;

// bi-directional many-to-one association
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDN_COUNTRY", insertable = false, updatable = false)
private Country tCountry;

@Column(name = "IDN_COUNTRY")
private Integer idnCountry;

最佳答案

关于您的问题:在 Query.list() 执行脏检查之前 hibernate 并自动执行 flush() 以防止状态不一致。
为了防止这种情况,如果您不想自动刷新,但只在提交时更改,请将 Session.flushMode 更改为 COMMIT。
关于你的例子,有两件事:

  • 为什么不使用 getter 来获取 tOrigin、tCountry、tDest
  • 您可以在Ship更新之前阅读tOrigin、tCountry、tDest吗?

关于java - Hibernate在查询Entity2时自动更新Entity1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18147186/

相关文章:

java - Java购物车空指针异常 "sort"方法

java - JpaRepository 中的动态实体名称?

java - 查询 MongoDB 数组并使用最匹配的元素进行排序

java - Hibernate:多对一关系,仅加载一次多关系

hibernate - 在单元测试中使用Java 8 Time API的Grails 3.1.1

java - Java 中 GUI 和线程的奇怪之处

java - ActionListener 没有响应?

java - 如何在 Hibernate 中保存时增加版本字段,无论是否脏?

mysql - HTTP 状态 404 - 请求的资源不可用,未显示我的网页

java - 加载对象时出现 Hibernate 错误 : java. lang.StackOverflowError