2012-01-23 53 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