我不期待这个问题的具体答案,因为它太复杂而无法详细解释,只是对问题所在的一些指导。
总结一下,我有一个实体Ship,带有实体Origin,Destination和Country的外键。我从数据库中获取一个Ship,然后修改其他字段(日期),然后在数据库中查询相关的Origin,Destination和Country。当我查询Origin和Country时,它会按预期运行,但当我查询Destination时,执行query.getResultList()
时,select a from DESTINATION
之前,Hibernate会自动执行update SHIP set ...
并设置所有发货除了IDN_DEST之外的字段。
知道这会发生什么事吗?
我的猜测是,由于实体已经在会话中进行了修改,因此需要更新某些事情,但这就是全部。
对于我所看到的,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;
答案 0 :(得分:1)
关于您的问题:在Query.list()
执行脏检查之前进行休眠并自动执行flush()
以防止状态不一致。
如果您不希望自动刷新,则仅在提交时阻止将更改Session.flushMode
发送到COMMIT。
关于你的例子,有两件事:
tOrigin, tCountry, tDest
?tOrigin, tCountry, tDest
更新之前阅读Ship
吗? 答案 1 :(得分:0)
正在发生这种情况,因为当您选择Destination
hibernate时会自动刷新会话,因此Ship
的状态会在数据库中更新。这意味着当您修改其他字段(日期)时,船舶对象将附加到会话中。
答案 2 :(得分:0)
这不应该只用Destination
作为tibtof告诉当你从数据库中获取数据时它会创建持久对象,当你修改它时,hibernate会在刷新连接时在数据库中更新它,你可以尝试的是手动提取Origin
或Country
刷新会话,您应该获得与“目的地”相关的更新数据。