2011-10-27 69 views
1

我试图让我的DAO的工作是这样的:保存休眠,休眠回滚

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(); 
    } 
  1. 通过注释掉例外,更新将提交。
  2. 通过取消注释(?)异常,它将回滚。

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

+0

使它在尝试...赶上类似:尝试{....做冬眠的东西...} catch(illegalargumentexception e){session.rollback();} finally {session.close} – anfy2002us

回答

1

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

IMO,你的方法更像是一个业务操作而不是持久化操作。当你有服务层时,我建议你将这个方法移到它上面。

所以,你NumberDAO可能看起来像这样:

public class NumberDAO { 

    public Number loadById(long id){ } 

} 

你NumberService可能看起来像这样:

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

} 

当您在业务层使用事务注解,它会自动若犯您的服务方法将成功返回。如果在方法返回之前抛出任何异常,则该事务将自动回滚。

+0

谢谢,我尝试过这种方法,但是,它在抛出异常时无法将其提交到数据库中......对此有何建议? –

+0

如果抛出异常,则意味着事务应该回滚。如果你想提交交易,那么你不应该抛出异常。你想要什么? –

+0

在抛出异常时进行提交,并在抛出异常时进行回滚。出于某种原因,即使没有抛出异常,更新也不会被提交到数据库中。 –