簡體   English   中英

使用HIbernate和Spring的@Transactional批注不能持久保存數據

[英]Data does not persist using HIbernate with Spring's @Transactional Annotation

我目前正在編寫一個使用Spring和Hibernate的應用程序。 在我的服務層中,我注入了一個DAO,它將執行一些非常基本的CRUD操作。 對於笑容,我創建了一個注釋如下的方法:

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

daopersist方法如下所示:

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方法(以及由數據存儲分配的新主鍵ID)看到它,但是,當“ doSomeWork”方法完成時,我的數據實際上並沒有保留到基礎數據存儲(Oracle 10g)。

但是,如果我刪除@Transactional批注並使用Hibernate的session.getTransaction()。begin()和session.getTransaction()。commit()(或回滾),則代碼將按預期運行。

因此,我的基本問題將是:Hibernate是否實際上不將Spring的事務管理用於實際事務管理?

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

除了更好地了解Spring和Hibernate的工作知識之外,我可能還缺少什么?

不要忘了添加<tx:annotation-driven>以獲得@Transactional支持

聽起來像spring並沒有實際注入事務處理代碼。 您的配置文件中是否有類似的內容,以告訴spring在哪里尋找帶注釋的類?

<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>

您使用什么方法從會話工廠獲取會話對象? 您正在使用openSession()getCurrentSession() ,還是其他方式? 這很重要,因為您需要將會話綁定到春季事務(我懷疑openSession是否適合您的情況)

我建議您使用Spring的hibernateTemplate來調用saveOrUpdate並持久化,而不要使用會話對象。 這樣,您可以確保將其綁定到事務,並且,如春季承諾的那樣,如果您更改了事務管理策略,則無需更改代碼。

好吧,謝謝大家的回應...這幫助我弄清楚我做錯了什么...

在我狂熱的“概念驗證”中,直到我意識到我的“帶有主要方法的簡單Java類將完成我的所有工作”才真正發生在我身上,直到春天,我才開始管理它,所以沒有真實交易管理。 這絕對不會像產品應用程序那樣,由具有控制器bean,服務等的應用服務器來管理。

然后它突然出現在我身上……“服務”……我將要有一個服務層,這就是事務支持的地方。 因此,就在下雨的時候,我創建了一個簡單的服務bean(標記為@Transactional),它的工作與我希望的一樣。 因此,我在服務上調用方法,在我的Dao和bam上調用方法! 有用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM