Java 休眠保存,休眠回滚

Java 休眠保存,休眠回滚,java,hibernate,commit,rollback,Java,Hibernate,Commit,Rollback,我试图让我的刀以这种方式工作: public void incrementNumber(long id) throws Exception{ Session session = factory.openSession(); Number n = (Number)session.load(Number.class, id); n.setNumber(n.getNumber() +5); // throw new IllegalArg

我试图让我的刀以这种方式工作:

    public void incrementNumber(long id) throws Exception{
        Session session = factory.openSession();
        Number n = (Number)session.load(Number.class, id);
        n.setNumber(n.getNumber() +5);
//      throw new IllegalArgumentException("BLAH");
        session.close();
    }
  • 通过注释掉异常,更新将提交
  • 通过取消注释(?)异常,它将回滚

  • 有什么办法可以做到这一点?注意:事务部分在事务注释下的服务中完成。

    DAO主要负责持久性操作。它应该只提供CRUD和一些与特定实体相关的查找方法

    在我看来,您的方法更像是一个业务操作,而不是持久性操作。由于您有服务层,我建议您将此方法移动到它

    因此,您的号码Dao可能如下所示:

    public class NumberDAO {
    
         public Number loadById(long id){ }
    
    }
    
    public class NumberService{
    
            //Inject by DI containers , or setter / constructor
            NumberDAO numberDAO;
    
             public void incrementNumber(long id , int increaseAmount) throws Exception{
    
                    Number n = (Number) numberDAO.loadById(id);
    
                    if (XXXXXXXX) 
                        throws new IllegalArgumentException("BLAH BLAH BLAH BLAH");
    
                    n.setNumber(n.getNumber() +increaseAmount);
             }
    
    }
    
    您的数字服务可能如下所示:

    public class NumberDAO {
    
         public Number loadById(long id){ }
    
    }
    
    public class NumberService{
    
            //Inject by DI containers , or setter / constructor
            NumberDAO numberDAO;
    
             public void incrementNumber(long id , int increaseAmount) throws Exception{
    
                    Number n = (Number) numberDAO.loadById(id);
    
                    if (XXXXXXXX) 
                        throws new IllegalArgumentException("BLAH BLAH BLAH BLAH");
    
                    n.setNumber(n.getNumber() +increaseAmount);
             }
    
    }
    

    当您在服务层中使用事务性注释时,如果您的服务方法成功返回,它将自动提交。如果在方法返回之前抛出任何异常,事务将自动回滚。

    DAO主要负责持久性操作。它应该只提供CRUD和一些与特定实体相关的查找方法

    在我看来,您的方法更像是一个业务操作,而不是持久性操作。由于您有服务层,我建议您将此方法移动到它

    因此,您的号码Dao可能如下所示:

    public class NumberDAO {
    
         public Number loadById(long id){ }
    
    }
    
    public class NumberService{
    
            //Inject by DI containers , or setter / constructor
            NumberDAO numberDAO;
    
             public void incrementNumber(long id , int increaseAmount) throws Exception{
    
                    Number n = (Number) numberDAO.loadById(id);
    
                    if (XXXXXXXX) 
                        throws new IllegalArgumentException("BLAH BLAH BLAH BLAH");
    
                    n.setNumber(n.getNumber() +increaseAmount);
             }
    
    }
    
    您的数字服务可能如下所示:

    public class NumberDAO {
    
         public Number loadById(long id){ }
    
    }
    
    public class NumberService{
    
            //Inject by DI containers , or setter / constructor
            NumberDAO numberDAO;
    
             public void incrementNumber(long id , int increaseAmount) throws Exception{
    
                    Number n = (Number) numberDAO.loadById(id);
    
                    if (XXXXXXXX) 
                        throws new IllegalArgumentException("BLAH BLAH BLAH BLAH");
    
                    n.setNumber(n.getNumber() +increaseAmount);
             }
    
    }
    

    当您在服务层中使用事务性注释时,如果您的服务方法成功返回,它将自动提交。如果在方法返回之前抛出任何异常,事务将自动回滚。

    提交并不总是提交到db,在会话缓存中设置必须提交,然后在执行刷新(也取决于配置)时,提交将转到DB,或者在会话/事务结束时提交

    因此,如果要强制执行,请在提交后使用flush()。
    如果您可以在会话/事务关闭后等待检查。

    提交并不总是提交到db,而是在会话缓存中设置必须提交,然后当您进行刷新时(也取决于配置),提交将转到db,或者当会话/事务结束时

    因此,如果要强制执行,请在提交后使用flush()。
    如果您可以在会话/事务关闭后等待检查。

    在try中创建它…捕获类似以下内容:try{…执行hibernate操作…}catch(illegalargumentexception e){session.rollback();}最后{session.close}在try中创建它…捕获类似以下内容:try{…执行hibernate操作…}catch(illegalargumentexception e){session.rollback();}最后{session.close}谢谢,我尝试了这个,但是,当它抛出异常时,它无法提交到数据库中…对此有什么建议吗?如果抛出异常,这意味着事务应该回滚。如果要提交事务,则不应该抛出异常。实际上,您想要什么?在抛出无异常时提交,然后回滚当抛出异常时返回。由于某种原因,即使没有抛出异常,更新也不会提交到数据库中。这听起来像是事务注释的问题。你确定它真的有效吗?此外,请确保DAO和服务使用相同的hibernate会话。这是t的注释函数:'@Transactional(readOnly=false,rollboor=DataIntegrityViolationException.class)'谢谢,我尝试了这个方法,但是,当它确实抛出异常时,它无法提交到数据库中…对此有什么建议吗?如果抛出异常,这意味着事务应该回滚。如果要提交事务,则不应该抛出异常。您实际上想要什么?在抛出无异常时提交,然后rol引发异常时返回。出于某种原因,即使没有引发异常,更新也不会提交到数据库中。这听起来像是事务性批注的问题。您确定它真的有效吗?此外,请确保DAO和服务使用相同的hibernate会话。这是的批注函数:'@Transactional(readOnly=false,rollboor=DataIntegrityViolationException.class)'