2012-07-04 74 views
2

也許標題有點誤導,但我想問你一條建議。spring mvc hibernate正確的事務管理方式

現在,讓我們說我已經配置了我的spring mvc應用程序的休眠和事務。部分配置是這樣的:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/> 
    <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> 
    <property name="user" value="xxx"/> 
    <property name="password" value="xxx"/> 
    <property name="maxPoolSize" value="10"/> 
    <property name="maxStatements" value="0"/> 
    <property name="minPoolSize" value="5"/> 
</bean> 
<!-- Session Factory Declaration --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
    <property name="packagesToScan" value="com.execon.models"/> 
</bean> 

<!-- Enable the configuration of transactional behavior based on annotations --> 
<tx:annotation-driven transaction-manager="txManager"/> 

<!-- Transaction Manager is defined --> 
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

所以基本上我現在需要做的,僅僅是@Autowired我sessinFactory類將管理數據庫訪問權限?

一個簡單的例子,雖然它與@Controller,我將它移到@Service

@Resource(name = "sessionFactory") 
private SessionFactory sessionFactory; 

@RequestMapping(value = "/") 
public String getMainPage(Model model) 
{ 
    Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    Query query = session.createQuery("from Period"); 
    List<Period> list = query.list(); 
    System.out.println(list); 
    session.getTransaction().commit(); 
    return "MainPage"; 
} 

正如你看到的,我只是試圖把一個映射類的性病控制檯名單上。它工作的很好,但我需要一個建議如何在更大的項目中進行管理。我應該有一些獲得會話和開始事務的util類嗎?或者我應該使用一些模板來管理它?只是我不想寫這個:

Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    // 
    //... 
    // 
    session.getTransaction().commit(); 

在我需要連接到數據庫的每一個地方。也許我錯過了什麼,或者完全錯誤?任何幫助,將不勝感激

回答

3

你缺少的位是春季交易註釋。

@RequestMapping(value = "/") 
@Transactional 
public String getMainPage(Model model) 
{ 
    Session session = SessionFactoryUtils.openSession(sessionFactory); 
    Query query = session.createQuery("from Period"); 
    List<Period> list = query.list(); 
    System.out.println(list); 
    return "MainPage"; 
} 

很明顯,正如你指出的那樣,正常的事情是分開數據庫的東西。

在您的上下文文件,你將需要:在這個具體的例子

<tx:annotation-driven transaction-manager="txManager" /> 

注意,你需要把這個在XXX-servlet.xml上下文文件,因爲這是配置控制器的東西。

spring和hibernate的一般思想是使用spring來進行事務和連接管理。使用SessionFactoryUtil登記員將hibernate Session作爲綁定到當前線程的事務資源。

+0

請告訴我是否正確: 第一個問題:具有類範圍的@ Transactional意味着此類中的EVERY方法將使用事務權進行處理? 第二個問題:通過使我的POJO(Period類)'@ Transactional'完成了錯誤的事情嗎? 第三個問題:來自'org.springframework.orm.hibernate3'包的'getSession()'等於'org.springframework.orm.hibernate4'包中的'openSession()'? – kamil

+0

Q1是的..你可以將整個班級設置爲交易...然後在每種方法上對其進行優化。 Q2沒有特別錯誤..整個spring的意思是使用POJO,使控制器交易的方法不是很好的風格,但是對於一個小項目,如果你可以測試的話。 Q3是的,它是一樣的..抱歉,沒有拿起hibernate4軟件包名稱...將更新答案 –