查询Entity2时,Hibernate自动更新Entity1

时间:2013-08-09 12:57:09

标签: java hibernate

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

总结一下,我有一个实体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;

3 个答案:

答案 0 :(得分:1)

关于您的问题:在Query.list()执行脏检查之前进行休眠并自动执行flush()以防止状态不一致。
如果您不希望自动刷新,则仅在提交时阻止将更改Session.flushMode发送到COMMIT。
关于你的例子,有两件事:

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

答案 1 :(得分:0)

正在发生这种情况,因为当您选择Destination hibernate时会自动刷新会话,因此Ship的状态会在数据库中更新。这意味着当您修改其他字段(日期)时,船舶对象将附加到会话中。

答案 2 :(得分:0)

这不应该只用Destination作为tibtof告诉当你从数据库中获取数据时它会创建持久对象,当你修改它时,hibernate会在刷新连接时在数据库中更新它,你可以尝试的是手动提取OriginCountry刷新会话,您应该获得与“目的地”相关的更新数据。