2012-06-12 159 views
0

在Spring + Hibernate + JTA項目中,我試圖讓異常處理工作。對於下面的代碼:春季休眠異常處理

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT) 
public HandsetManufacturer createHandsetManufacturer(
     HandsetManufacturer handsetManufacturer) 
     throws HandsetManufacturerAlreadyExistsException{ 
    HandsetManufacturer handsetManufacturer2=new HandsetManufacturer(); 
    try { 

      handsetManufacturerDao.findByUniqueProperty(
       HandsetManufacturer.class, NAME_PROPERTY, 
       handsetManufacturer.getName()); 
     throw new HandsetManufacturerAlreadyExistsException(); 
    } catch (BusinessObjectNotFoundException ignoreMe) { 
    } 
    //handsetManufacturer2= handsetManufacturerDao.create(handsetManufacturer); 

    try{ 
     handsetManufacturer2= handsetManufacturerDao.create(handsetManufacturer); 
    }catch (JDBCException e) { 
     System.out.println("::HibernateException::"+e.getSQL()); 
     System.out.println("::HibernateException::"+e.getErrorCode()); 
     System.out.println("::HibernateException::"+e.getSQLState()); 
     System.out.println("::HibernateException::"+e.getSQLException()); 
     System.out.println("::HibernateException::"+e.getMessage()); 
     System.out.println("::HibernateException::"+e.getCause()); 
     throw new TechnicalException(e); 
    } 

    return handsetManufacturer2; 
} 

我試圖抓住潛在的休眠/ JDBC/DB異常(例如,當實體依賴仍然存在刪除將失敗,org.springframework.orm.hibernate3.HibernateJdbcException)並執行一些操作。但是,捕獲代碼永遠不會到達。

但是,如果我從我的方法中刪除「@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)」,它將達到catch塊。 我想這與Spring管理這種方式有關,但我不知道我是如何在JDBCException期間捕獲異常並使用@Transaction註釋

任何幫助表示讚賞!

回答

0

我想你的DAO也被配置爲與REQUIRED傳播有交易。在Hibernate中,有很多操作被延遲直到會話被刷新。刷新將發生的時間之一是事務提交之前。這意味着如果你的方法(我猜它是一些服務中的一個方法)正在進行事務處理,那麼Hibernate在你的DAO中持久化或保存動作create()在你的服務方法完成之前實際上不會去DB。

一種解決方法是顯式執行會話flush()(您可能會考慮放入DAO的create()),以便它會觸發數據庫更新並因此導致您期望拋出的異常。