2012-12-17 38 views
1

我正在使用Spring(3.11)數據/存儲庫和JPA(2.0)/ Hibernate(3.5.6)一起使用,並且我有一個與CrudRepository的保存方法有關的問題。CrudRepository的保存方法返回一個bean,即使它沒有被創建

全球服務,我有如下:

@Override 
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 
public MyBean createMyBean(MyBean myBean) { 


    // 1) 
    // myBean does not have PK, it will be generated via sequence 
    MyBean myBean = myBeanRepository.save(myBean); 

    // 2) 
    // sends event to queue 
    syncEventProducer.sendSyncEvent(....); 

    return myBean; 
} 

我的問題很簡單:我故意將一定爲myBean不滿足表的要求(一般爲我設置爲空列其中在數據庫中被創建爲非空),那麼在調用1)內部會產生一個異常(例如DataIntegrityViolationException),但仍然會執行2)。這是爲什麼?

MyBeanRepository是這樣的:

public interface MyBeanRepository extends CrudRepository<MyBean, Integer> { 

} 

挖在我見過的代碼一點點是關係到我的倉庫的SimpleJpaRepository確實返回我的一個新的PK豆儘管這不應該發生。

當然,最後整個事務會回滾,但我仍然不明白爲什麼myBeanRepository.save(myBean)「吞下」異常並返回一個帶有新PK的新bean。

感謝,

哈維

回答

4

我認爲這是因爲當你有你的createMyBean方法Transactional註釋,交易只在方法的最後完成。 Hibernate session.flush()只在提交事務時調用,如果不明確調用它。所以insert語句實際上是在2之後對數據庫執行的,只有在那之後拋出了異常。

+0

謝謝,它現在使所有的感覺 –

+0

是的,你能標記答案是正確的嗎?謝謝。 –

相關問題