2010-02-02 89 views
1

我有一個應用程序,我目前正在使用Spring和Hibernate進行編寫。在我的服務層中,我注入了一個DAO,它將執行一些非常基本的CRUD操作。對於笑容,我已經創建註釋的方法如下:使用HIbernate和Spring的@Transactional註解不能保持數據

@Transactional(readOnly = false, propogation=Propogation.REQUIRES_NEW) 
public void doSomeWork(Dao dao, Entity e){ 
    //do some searching 
    dao.persist(e); 
    dao.findAll(Entity.clz); 
} 

的道persist方法是這樣的:

public void persist(Entity e){ 
    session.saveOrUpdate(e); //This has already been built using a SessionFactory 
} 

在DAO的findAll方法看起來像這樣

public void findAll(Class clz) { 
    session.createCriteria(clz).list(); 
} 

現在,一切似乎都在運行,好的。在插入(保留)我的對象後,我可以使用findAll方法(以及它由Data Store分配的新的主鍵ID)查看它,但是,當「doSomeWork」方法完成時,我的數據實際上並不實際堅持到底層數據存儲(Oracle 10g)。但是,如果我刪除@Transactional註釋並使用Hibernate的session.getTransaction()。begin()和session.getTransaction()。commit()(或回滾),則代碼按我預期的方式工作。

因此,我的底層問題是:Hibernate是否實際上並未將Spring的事務管理用於實際事務管理?

在我的bean配置文件中,我聲明瞭一個TransactionManager bean,一個SessionFactory bean,並且我也包含在配置文件中。

我可能會錯過什麼,除了更好地瞭解Spring和Hibernate?

+0

顯示你的配置文件 – axtavt 2010-02-02 18:56:41

+0

對不起...這有點令人困惑...我用@Repository註釋創建DAO ... – 2010-02-02 19:58:40

回答

1

好了,好了,感謝大家誰回答...它幫助我找出我做錯了......

在我過於熱情的「可理解性證明」中,直到我意識到我的「使用主要方法完成所有工作的簡單Java類」不是由Spring管理的時候,我從未真正明白過究竟發生了什麼事情。沒有真正的交易管理。這決不會像產品應用那樣,通過具有控制器豆類,服務等的應用服務器來管理。

然後,我明白了......「服務」......我要去有一個服務層,這就是交易支持所在的地方。所以,就像下雨一樣,我創建了一個簡單的服務bean(用@Transactional標記),它的工作方式就像我希望的那樣。所以,我在我的服務上調用方法,調用我的Dao和bam方法!有用。

再次感謝所有幫助我得出結論的人。

1

您使用什麼方法從會話工廠獲取會話對象?你在使用openSession()還是getCurrentSession(),或者是其他的東西?這很重要,因爲你需要將會話綁定到春季交易(我懷疑openSession是否適合你的場景)

我建議你使用Spring的hibernateTemplate來調用saveOrUpdate和persist,而不是使用會話對象。這樣您就可以保證它將被綁定到事務處理上,並且,如果您更改了事務管理策略,就像春季承諾一樣,您不需要更改代碼。

+0

我實際上走了這條路,似乎得到了同樣的結果,不過,讓我再試一次。 – 2010-02-02 20:01:17

+0

由於Spring 2可以自動注入sessionfactory,因此HibernateTemplate不是一種可行的方式。檢查這裏:http://swik.net/Spring/Interface21+Team+Blog/So+should+you+still+use+Spring%27s+HibernateTemplate+and%2For+JpaTemplate%3F%3F/bcw59 – fasseg 2010-02-02 20:05:26

2

聽起來像春天沒有實際注入事務處理代碼。 你是否在你的配置文件中有這樣的東西,告訴春天在哪裏尋找註釋類?

<beans xmlns:context="http://www.springframework.org/schema/context" ... 
    xsi:schemaLocation="http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd ..." > 

    ... 
    <context:annotation-config/> 
    <context:component-scan base-package="mypackage.dao.impl"/> 

    <bean name="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

</beans> 
+0

是的,這個是爲了所有的意圖和目的,正是我的配置看起來像。我還得到了一個SessionFactory bean,其中引用了我的hibernate-config ...我有一個HibernateTemplate,帶有一個指向我的SessionFactory bean的引用,以及一個帶有對SessionFactory bean的引用的HibernateTransactionManager。 – 2010-02-02 20:00:55

4

不要忘記添加<tx:annotation-driven>@Transactional支持

+0

不要與 ehrhardt 2012-10-10 22:12:38

+0

或@EnableTransactionManagement混淆 – oers 2013-04-24 15:05:49

相關問題