我一直在将 Hibernate 用于一个项目,但我对它的实际工作原理还有一些疑问。特别是对于持久/分离状态的刷新以及 createQuery、从会话中获取和加载之间的区别。
在以下示例中,“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 进行刷新操作后会有不同的行为?这是正常行为吗?如果是,有人可以解释其中的区别吗?
感谢您的帮助。