關於spring整合hibernate使用update無異常但沒有效果(不輸出sql語句)
阿新 • • 發佈:2019-01-24
單獨使用hibernate時
openSession()
在沒有使用spring控制事務時,使用的是sessionFactory.openSession()。這樣每個方法都會新建一個session,必須在方法中控制和關閉session。
於是一開始我直接在try-with-resource語句中使用session的update等方法,無任何事務,在單元測試時發現update方法和delete方法無效。
解決方法有兩種:
加上事務控制:
session.beginTransaction()和trans.commit()
加上flush方法:
session.flush()
getCurrentSession()
使用getCurrentSession建立的session會繫結到當前執行緒,並會在commit或rollback後自動關閉
使用currentSession,就必須使用事務管理
使用Spring事務管理
- 需要使用getCurrentSession獲取session
- 在操作中不要顯示的關閉session
- 不需要進行編碼式事務,使用宣告式事務
例項:
1. 在spring配置檔案中新增如下程式碼
<!--hibernate事務-->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" >
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--aop管理事務-->
<aop:config>
<aop:pointcut expression="execution(* wo.idao.*.*(..))" id="daoCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="daoCut"/>
</aop:config >
<tx:advice transaction-manager="txManager" id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
此時的dao層只需要簡單的 session().update(entity)
就行了。
再次單元測試,ok了