我并不期待这个问题的具体答案,因为它太复杂,无法详细解释,只是对问题可能出在哪里的一些指导。
我总结一下,我有一个实体“船舶”,带有实体“出发地”、“目的地”和“国家/地区”的外键。我从数据库中获取一艘船,然后修改其他字段(日期),然后查询数据库中相关的出发地、目的地和国家/地区。当我查询 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/