0

詳細に説明するには複雑すぎるため、この質問に対する具体的な回答は期待していません。問題がどこにある可能性があるかについてのガイダンスです。

要約すると、エンティティの出発地、目的地、国への外部キーを持つエンティティの船があります。データベースから船を取得し、他のフィールド (日付) を変更してから、関連する出発地、目的地、および国をデータベースに照会します。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 への
変更を防止するには、コミット時のみにします。 あなたの例について、2つのこと: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 がデータベースからデータをフェッチするときに永続オブジェクトを作成し、それを変更すると、接続をフラッシュするときに休止状態がデータベースで更新すると言われているだけで行うべきではありません 。手動でセッションをフェッチOriginまたはフラッシュした後に試すことができます。 Country「Destination」で起こったこととしてデータを更新しました。

于 2013-08-09T14:09:49.987 に答える