私はプロジェクトに Hibernate を使用してきましたが、実際にどのように機能するかについていくつか疑問があります。特に、永続的/切り離された状態での更新と、セッションからの createQuery、get、および load の違いについて説明します。
次の例では、「groupe」は最初、まだコミットされていない変更された値を持つ永続的な状態にあります。
ケース #1
// createQuery before evict
// g and groupe point to the same object
Groupe g = (Groupe) session.createQuery("from Groupe as g where g.idGroupe = '" + theid + "'").uniqueResult();
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
session.evict(groupe);
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
session.refresh(groupe);
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
ケース#2
// get before evict
// g and groupe point to the same object
Groupe g = (Groupe) session.get(Groupe.class, theid);
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
session.evict(groupe);
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
session.refresh(groupe);
System.out.println("groupe=" + groupe.getTitle()); // value from database
System.out.println("g=" + g.getTitle()); // value from database
ケース #3
// load before evict
// g and groupe point to the same object
Groupe g = (Groupe) session.get(Groupe.class, theid);
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
session.evict(groupe);
System.out.println("groupe=" + groupe.getTitle()); // modified value
System.out.println("g=" + g.getTitle()); // modified value
session.refresh(groupe);
System.out.println("groupe=" + groupe.getTitle()); // value from database
System.out.println("g=" + g.getTitle()); // value from database
createQuery を使用した更新アクションの後に動作が異なるのはなぜですか? これは正常な動作ですか? はいの場合、誰かが違いを説明できますか?
ご協力ありがとうございました。