2011-10-27 202 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

在拋出異常時進行提交,並在拋出異常時進行回滾。出於某種原因,即使沒有拋出異常,更新也不會被提交到數據庫中。 –