私はHibernate 3.3.1を使用しています。
私はdbテーブルを持っています(2フィールド:id
、name
)。 Hibernateを使用してこのテーブルのクラスを作成しました。私はsession.saveorUpdate
を使用してそれらを保存したいし、それがフォームDBをロードしたALL行を保存し、変更を行った後Hibernateは不要なクエリを生成します
@Entity
@Table(name = "table1")
public class QTable1 implements Serializable {
public QTable1() {
}
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO) //<- modification: to comment this line
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "name")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
。彼らは変更されませんでした場合でも:
update table1 set name='a' where id=1
update table1 set name='b' where id=2
update table1 set name='cc' where id=3 // only this row changed
コードを、エンティティの変更:
final QTable1 item = (QTable1) listTable1.getSelectedValue();
if (item != null) {
item.setName(table1Name.getText());
}
トランザクションコード:
final Session session = Commons.getSessionFactory().openSession();
session.beginTransaction();
for (Object o : pool.getTable1List().toArray()) {
final QTable1 item = (QTable1) o;
session.saveOrUpdate(item);
}
session.getTransaction().commit();
は、なぜそれがすべてのデータを保存しますか?私はIDの実装を変更した場合
(@GeneratedValue(strategy=GenerationType.AUTO)
を削除):
@Id
@Column(name = "id")
private Long id;
それだけで、影響を受けた行を保存します。それは私が期待していることです。しかし、@GeneratedValue
を付けないと、テーブルに新しい行を追加しようとすると、手動でid
を指定する必要があります。
デバッグ中に私は@GeneratedValue
のセッションPersistanceContext
に自分のエンティティを持っていないので、entitySnapshotsByKey
でエンティティが新規であり、dbにフラッシュする必要があると見なします。
この問題を解決するにはどうすればよいですか?
UPDATE:私たちは@GeneratedValue
アノテーションを使用している場合
session.saveOrUpdate(item)
だけupdate
またはinsert
クエリを生成します。 TABLE1のため しかし、我々はない使用に@GeneratedValue
注釈を行う場合session.saveOrUpdate(item)
1を生成)select
は、オブジェクトが等しいか、我々はupdate
またはinsert
クエリを生成する必要があるかどうかを判断しませ 3)場合 2)を比較照会します。
今、なぜ@GeneratedValue
が値の照合を妨げるのか理解できません。 まだ私はなぜそれがメモリを(entitySnapshotsByKey
)選択された行のコピーを持っている場合、select
クエリを理解していない。
しかし私はちょうど良い私に合うsolvationを見つけた。 私が必要とするのはsession.saveOrUpdate(item)
をsession.merge(item)
に置き換えることだけです。 select
クエリが作成され、値が比較されることが隔離されます(@GeneratedValue
を使用するかどうか)。唯一の欠点は潜在的な多数のクエリです。
ありがとうございます。 select
クエリを生成しないように助けてくれたらうれしいです。
コードの一部のみを表示しています。残りのQTable1クラス、エンティティを変更するコード、およびトランザクション構成を表示できますか? –