0

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

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

知道这会发生什么吗?

我的猜测是,由于实体已在会话中被修改,休眠以某种方式需要更新,但仅此而已。

就我所见,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;
4

3 回答 3

1

关于您的问题:在Query.list()执行脏检查之前休眠并自动执行flush()以防止不一致的状态。如果您不希望自动刷新,但只能在提交时
防止更改为 COMMIT。 关于您的示例,有两件事:Session.flushMode

  • 为什么你不使用 getter 来获取tOrigin, tCountry, tDest
  • 更新tOrigin, tCountry, tDest前可以看吗?Ship
于 2013-08-09T14:44:45.377 回答
0

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

于 2013-08-09T13:09:09.597 回答
0

这不应该只Destination像 tibtof 告诉的那样,当你从数据库中获取数据时,它会创建持久对象,当你修改它时,hibernate 会在刷新连接时在数据库中更新它,你可以尝试在手动获取OriginCountry 刷新会话之后你应该得到将数据更新为“目的地”发生的情况。

于 2013-08-09T14:09:49.987 回答