我写了这段代码:
Account ac= new Account();
ac.setId(1);
ac.setType("checking");
ac.setAmount(12344.43);
//Transient
Configuration cfg= new Configuration();
cfg.configure("hibernate.cfg.xml");
try(Session s=sf.openSession();Session s1=sf.openSession()){
s.beginTransaction();
s.save(ac);//dirty checking
ac.setAmount(3000);
s.flush();
s.getTransaction().commit();
ac.setAmount(5000);
Account ac1=s1.get(Account.class, 1);
ac1.setAmount(8000);
s1.save(ac1);
s1.beginTransaction().commit();
}
sf.close();
在我们再次保存帐户对象的第二个会话中,它应该抛出错误但不会。有关于此的任何指示?
答案 0 :(得分:1)
由于您要保存相同的ID,
Account ac1=s1.get(Account.class, 1);
您只会更新现有记录(ID = 1)。
如果您有兴趣深入了解保存和其他持久方法的行为,可以在http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate处找到一篇好文章。
答案 1 :(得分:0)
完成ac1.setAmount(8000)后; 数据库将使用最新数据进行更新。但由于帐户对象已经与具有最新数据的会话相关联,因此不会向数据库触发保存查询,因此没有错误。
为了说明,
Account ac= new Account();
ac.setId(2);
ac.setType(AccountType.CHECKING);
ac.setDateOfOpening(LocalDateTime.now());
ac.setAmount(12344.43);
Configuration cfg= new Configuration();
cfg.configure("hibernate.cfg.xml");
Session s=sf.openSession();
s.save(ac);
ac.setType(AccountType.CHECKING);
s.beginTransaction().commit();
s.close();
sf.close();
它不会在db中触发任何更新查询,只有1个插入。因此,如果状态没有改变,并且它处于持久状态,则它不执行更新/保存