即使db中存在带密钥的记录,也不保存错误

时间:2018-01-09 22:45:32

标签: hibernate

我写了这段代码:

            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();

在我们再次保存帐户对象的第二个会话中,它应该抛出错误但不会。有关于此的任何指示?

2 个答案:

答案 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个插入。因此,如果状态没有改变,并且它处于持久状态,则它不执行更新/保存