2012-01-23 54 views
0

我有一個項目在春天,我有2個連接到數據庫。兩個是因爲一個用於只讀連接,另一個用於讀寫連接。春季休眠 - 交易

我的問題是,當我嘗試調用方法爲只讀,我得到:

No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

現在我不知道,如何準確配置我的連接。

下面我插入了我的SERVICE CLASS文件。問題是當我試圖調用方法sessionFactoryr,當我使用sessionFactory - 一切正常。

我的配置是:

休眠-context.xml中:

 <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:p="http://www.springframework.org/schema/p" 
      xmlns:tx="http://www.springframework.org/schema/tx" 
      xmlns:context="http://www.springframework.org/schema/context" 
      xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd 
       "> 

     <context:property-placeholder location="/WEB-INF/spring.properties" /> 

     <!-- Enable annotation style of managing transactions --> 
     <tx:annotation-driven transaction-manager="transactionManager" /> 
     <tx:annotation-driven transaction-manager="transactionManagerr" /> 

     <!-- Declare the Hibernate SessionFactory for retrieving Hibernate sessions --> 
     <!-- See http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/annotation/AnnotationSessionFactoryBean.html -->       
     <!-- See http://docs.jboss.org/hibernate/stable/core/api/index.html?org/hibernate/SessionFactory.html --> 
     <!-- See http://docs.jboss.org/hibernate/stable/core/api/index.html?org/hibernate/Session.html --> 

<!-- First Connection --> 

     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
        p:dataSource-ref="dataSource" 
        p:configLocation="${hibernate.config}" 
        p:packagesToScan="com.esb.scs"/> 

     <!-- Declare a datasource that has pooling capabilities--> 
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
        destroy-method="close" 
        p:driverClass="${app.jdbc.driverClassName}" 
        p:jdbcUrl="${app.jdbc.url}" 
        p:user="${app.jdbc.username}" 
        p:password="${app.jdbc.password}" 
        p:acquireIncrement="5" 
        p:idleConnectionTestPeriod="60" 
        p:maxPoolSize="100" 
        p:maxStatements="50" 
        p:minPoolSize="10" /> 

     <!-- Declare a transaction manager--> 
     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
        p:sessionFactory-ref="sessionFactory" /> 

<!-- Second connection (read only) -->      

     <bean id="sessionFactoryr" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
        p:dataSource-ref="dataSourcer" 
        p:configLocation="${hibernate.config}" 
        p:packagesToScan="com.esb.scs"/> 

     <!-- Declare a datasource that has pooling capabilities--> 
     <bean id="dataSourcer" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
        destroy-method="close" 
        p:driverClass="${app.jdbc.driverClassName}" 
        p:jdbcUrl="${app.jdbc.url}" 
        p:user="${appr.jdbc.username}" 
        p:password="${appr.jdbc.password}" 
        p:acquireIncrement="5" 
        p:idleConnectionTestPeriod="60" 
        p:maxPoolSize="100" 
        p:maxStatements="50" 
        p:minPoolSize="10" /> 

     <!-- Declare a transaction manager--> 
     <bean id="transactionManagerr" class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
        p:sessionFactory-ref="sessionFactoryr" /> 



    </beans> 

服務類:

package com.esb.scs.service; 


import static java.lang.System.out; 

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.List; 
import java.util.UUID; 

import javax.annotation.Resource; 
import javax.servlet.http.HttpServletRequest; 

import org.apache.log4j.Logger; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.springframework.security.authentication.encoding.Md5PasswordEncoder; 
import org.springframework.security.authentication.encoding.PasswordEncoder; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.esb.scs.domain.User; 
import com.esb.scs.domain.UserReference; 

@Service("userService") 
@Transactional 
public class UserService { 

    protected static Logger logger = Logger.getLogger("service"); 

// @Resource(name="sessionFactoryr") 
// private SessionFactory sessionFactoryr; 

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

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


    public void addUser(HttpServletRequest request){ 

     logger.info("test"); 

     Session session = sessionFactory.getCurrentSession(); 

     PasswordEncoder encoder = new Md5PasswordEncoder(); 
     String hashedPassword = encoder.encodePassword(request.getParameter("password"), null); 

     String login = request.getParameter("login"); 
     String password = hashedPassword; 
     //String role = request.getParameter("role"); 
     String role = "normal"; 
     String ip = request.getParameter("ip"); 
     int active = 1; 

     String referenceAddress = request.getParameter("referer"); 
     String sex = request.getParameter("sex"); 
     int age = Integer.parseInt(request.getParameter("age")); 
     String country = request.getParameter("country"); 
     String city = request.getParameter("city"); 
     String education = request.getParameter("education"); 
     String profession = request.getParameter("profession"); 
     String branch = request.getParameter("branch"); 


     Transaction transaction = session.beginTransaction(); 

     User user = new User(); 

     UserReference userReference = new UserReference(); 

     Date dateCreate = new Date(); 

     user.setEmail(login); 
     user.setPassword(password); 
     user.setRole(role); 
     user.setIp(ip); 
     user.setDateCreate(dateCreate); 
     user.setLastLoginDate(dateCreate); 
     user.setActive(active); 
     user.setToken(""); 

     userReference.setReferenceAddress(referenceAddress); 
     userReference.setSex(sex); 
     userReference.setAge(age); 
     userReference.setCountry(country); 
     userReference.setCity(city); 
     userReference.setEducation(education); 
     userReference.setProfession(profession); 
     userReference.setBranch(branch); 
     userReference.setSite(referenceAddress); 
     userReference.setUser(user); 



     userReference.setUser(user); 
     user.getUserReferences().add(userReference); 

     session.save(user); 
     session.save(userReference); 

     transaction.commit(); 

    } 

    public List<User> getUser(String name, String password){ 

     Session session = sessionFactoryr.getCurrentSession(); 

     String sqlQuery = "FROM User WHERE email='"+name+"' AND password = '" +password+ "'" ; 

     Query query = session.createQuery(sqlQuery).setMaxResults(1); 

     return query.list(); 

    } 


    public void updateUUID(String uuid, String login, String password){ 

     Session session = sessionFactory.getCurrentSession(); 

     Transaction transaction = session.beginTransaction(); 

     String hql = "update User set token = :token where email = :login and password = :password"; 

     Query query = session.createQuery(hql); 

     query.setString("token", uuid); 
     query.setString("login", login); 
     query.setString("password", password); 

     query.executeUpdate(); 

     transaction.commit(); 

    } 





} 

另外,我有

<filter> 
     <filter-name>hibernateFilter</filter-name> 
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
     </filter> 
     <filter-mapping> 
     <filter-name>hibernateFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     </filter-mapping> 

在我的網頁.XML。

根據您的建議,如果我將@Transactional("transactionManagerr")添加到我的方法 - 它不會改變任何東西,我仍然會得到錯誤。

回答

3

我認爲您必須在@Transactional(例如@Transactional("transactionManagerr"))註釋中指定事務管理器名稱。閱讀 DocumentationJira

+0

這不會幫助:( – Ilkar

+0

嘗試註釋每個方法,而不是類級別。什麼是你的視圖層?爲什麼你需要這個奇怪的'OpenSessionInViewFilter'過濾器? –

+0

好吧,我做了它...幫助的thants – Ilkar

0

如果使用事務註釋,則不需要在服務類中手動創建事務。

您已經指定了類是事務性的,這意味着每個方法都有自己的由spring創建的事務。

您還可以指定每種方法的事務性,並在需要時進一步指定只讀。

如果您使用兩個不同的數據源,則還需要指定要使用哪個事務管理器。

<bean id="transactionManagerr" class="org.springframework.orm.hibernate3.HibernateTransactionManager"    p:sessionFactory-ref="sessionFactoryr"> 
    <qualifier value="transactionManagerr"/>    
</bean> 

而在年服務類,你做到這一點:

@Transactional(value = "transactionManagerr") 

此外,我會考慮重新命名一切,只是追加「R」的一切是不是真的描述。

+0

好的,我嘗試了命名轉換,沒有 - 它不起作用。也許還有一些其他問題 - web.xml配置?應該如何看起來像web.xml配置?我有:' hibernateFilter < filter-name> org.springframework.orm.hibernate3.support。的OpenSessionInViewFilter <過濾器映射> hibernateFilter /* ' – Ilkar

+0

你並不需要提供一個過濾器映射hibernate它的alls et up在應用上下文中。你的看起來是正確的,我自己有兩個transactinomanagers,但我指定哪個用於每個方法使用註釋。沒有手動創建它們。 – NimChimpsky

+0

但是,如果我不添加過濾器,「transactionManagerr」dosn't工作,也不'transactionManager',如果我添加過濾器,然後只有'transactionManager'工程 - 所以我認爲,我需要過濾器,沒有它過濾器沒有任何作品 – Ilkar