2

以下に示すように、Hibernate を使用してデータを挿入し、同じセッションでデータを取得しています。

StudentBean st1 = new StudentBean();

st1.setSid(513);
st1.setSname("Ravi)");
st1.setTotMarks(0.0f);

Session sess = factory.openSession();
sess.persist(st1);

StudentBean   st2 = (StudentBean) sess.get(StudentBean.class, 510);
System.out.println(st2.getSname());

ハイバネート構成ファイルで show_sql true を使用した場合、この行を使用すると、出力は次のようになります。

クエリを選択

Hibernate: select studentbea0_.sid1 as sid1_0_0_, studentbea0_.sname1 as sname2_0_0_, studentbea0_.tot_m1 as tot3_0_0_ from student1 studentbea0_ where studentbea0_.sid1=?

クエリを挿入

insert into student1 (sname1, tot_m1, sid1) values (?, ?, ?)

Session.persist が get メソッドの上にあるにもかかわらず、挿入操作が Hibernate Engine によって最後に実行される理由を誰か教えてください。

4

2 に答える 2

1

persist() を呼び出しても、インスタンスはすぐにはデータベースに保存されません。これは休止状態のセッション (第 1 レベルのキャッシュ) に保存されるだけです。 get() を呼び出すと、休止状態は最初に ID 510 の Student のセッションをチェックしますが、見つからないため、データベースに移動します。これにより、選択が生成されます。セッションがフラッシュされると (つまり、session.close() を呼び出すと)、セッション内のすべてのインスタンスが検査され、変更がデータベースに書き込まれます。これによりインサートが生成されます。また、510 の属性のいずれかを変更した場合、それらは自動的に書き出され、更新が生成されます。

于 2012-06-18T11:04:07.057 に答える
0

どうやら Hibernate は、使用しているデータベースを単独で所有していると想定し、問題のレコードがデータベースの別のユーザーによって背後で変更されていないことを「認識」しています。したがって、あなたSession.get()は SQL をトリガーしませんSELECT。代わりに、オブジェクトは Hibernate のキャッシュから返されます。

より興味深い質問は、なぜ のSELECT にがあったかということINSERTです。Hibernate が最初のレベルのキャッシュにデータを入力することに関係している可能性があります。または、表示されていない先行するコードが原因である可能性があります。

于 2012-06-18T10:44:35.757 に答える