2011-05-30 65 views
2

有效起初的applicationContext.xml是:org.hibernate.HibernateException:合并也不是没有积极的交易

<?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:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> 

    <bean class="info.ems.config.EMSConfigurer"/> 

    <bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/> 

    <bean id="ems" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager" ref="transactionManager"/>   
    <property name="target">    
     <bean class="info.ems.EMSImpl" init-method="init"> 
      <property name="dao" ref="dao"/> 
      <property name="passwordEncoder" ref="passwordEncoder"/> 
      <property name="localeList" value="${ems.locales}"/> 
      <property name="releaseVersion" value="${ems.version}"/> 
      <property name="releaseTimestamp" value="${ems.timestamp}"/> 
      <property name="emsHome" value="${ems.home}"/> 
     </bean> 
    </property>  
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <bean id="dataSource" class="info.ems.datasource.DataSourceFactory"> 
    <property name="driverClassName" value="${database.driver}"/> 
    <property name="url" value="${database.url}"/> 
    <property name="username" value="${database.username}"/> 
    <property name="password" value="${database.password}"/> 
    <property name="validationQuery" value="${database.validationQuery}"/> 
    <property name="dataSourceJndiName" value="${database.datasource.jndiname}"/> 
    </bean>  

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

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="configLocation"> 
      <value>/WEB-INF/hibernate.cfg.xml</value> 
     </property> 
    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
     </property>   
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop>   
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</prop> 
     </props> 
    </property>   
    </bean> 

    <bean id="dao" class="info.ems.hibernate.HibernateEMSDao" init-method="createSchema"> 
    <property name="hibernateTemplate"> 
     <bean class="org.springframework.orm.hibernate3.HibernateTemplate"> 
      <property name="sessionFactory" ref="sessionFactory"/> 
     </bean> 
    </property>   
    <property name="schemaHelper"> 
     <bean class="info.ems.hibernate.SchemaHelper">         
      <property name="driverClassName" value="${database.driver}"/> 
      <property name="url" value="${database.url}"/> 
      <property name="username" value="${database.username}"/> 
      <property name="password" value="${database.password}"/> 
      <property name="hibernateDialect" value="${hibernate.dialect}"/> 
      <property name="dataSourceJndiName" value="${database.datasource.jndiname}"/> 
     </bean>     
    </property> 
    </bean>  
</beans> 

服务层是EMS.java接口:

public interface EMS extends UserDetailsService { 

    public void saveUser(User user); 
} 

而其执行EMSImpl.java:

@Service("emsImpl") 
@Transactional(readOnly=true) 
public class EMSImpl implements EMS { 

    private final Logger logger = LoggerFactory.getLogger(getClass()); 

    @Autowired 
    @Qualifier("dao") 
    private EMSDao dao; 


    //some other code 


    @Transactional(readOnly=false) 
    public void saveUser(User user) { 

    } 
} 

接口dao是EMSDAO.java:

@Transactional(readOnly=true) 
public interface EMSDao { 

    public void saveUser(User user); 
} 

及其实施HibernateEMSDao.java

@Repository("EMSDao") 
public class HibernateEMSDao extends HibernateDaoSupport implements EMSDao { 

    private final Logger logger = LoggerFactory.getLogger(getClass()); 

    private SchemaHelper schemaHelper; 

    public void setSchemaHelper(SchemaHelper schemaHelper) { 
     this.schemaHelper = schemaHelper; 
    } 

    @Transactional(readOnly=false) 
    public synchronized void saveUser(final User user) {   
     Session session = getSessionFactory().getCurrentSession(); 
     session.merge(user); 
    } 


    public void createSchema() {   
     try { 
      getHibernateTemplate().find("from User user where user.id = 1"); 
     } catch (Exception e) { 
      logger.warn("expected database schema does not exist, will create. Error is: " + e.getMessage()); 
      schemaHelper.createSchema(); 
      User admin = new User(); 
      admin.setUsername("admin"); 
      admin.setName("Admin"); 
      admin.setEmail("admin"); 
      admin.setPassword("21232f297a57a5a743894a0e4a801fc3"); 
      admin.setRoles(new HashSet<Role>(Arrays.asList(new Role("admin", "ADMINISTRATOR")))); 
      logger.info("inserting default admin user into database"); 
      saveUser(admin); 

      logger.info("schema creation complete");       
      return; 
     } 
     logger.info("database schema exists, normal startup");    
    } 
} 

当我插入用户管理我收到此错误后部署的战争:

12:40:11,111 INFO [STDOUT] 2011-05-30 12:40:11,111 [ScannerThread] INFO [info.ems.datasource.DataSourceFactory] - Attempting to shut down embedded HSQLDB database. 
12:40:11,217 INFO [STDOUT] 2011-05-30 12:40:11,217 [ScannerThread] INFO [info.ems.datasource.DataSourceFactory] - Embedded HSQLDB database shut down successfully. 
12:40:11,220 INFO [STDOUT] 2011-05-30 12:40:11,218 [ScannerThread] ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ems' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot create inner bean 'info.ems.EMSImpl#586f403e' of type [info.ems.EMSImpl] while setting bean property 'target'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'info.ems.EMSImpl#586f403e' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'dao' while setting bean property 'dao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: merge is not valid without active transaction 

什么我做错了,是有什么我错过了?

感谢和问候。

+0

您正在捕获'createSchema()'中的所有异常。我不认为你的意图。您应该捕获更具体的异常,因为异常处理逻辑假定存在某些条件,例如存在事务。 – 2011-05-30 07:30:42

+0

@Vineet雷诺兹谢谢。在createSchema()之后,控制台正在打印异常消息。那么你在这种情况下建议什么?配置是否正常? – 2011-05-30 07:34:54

+0

你需要[捕获并处理特定的异常](http://stackoverflow.com/questions/5979501/in-java-what-is-the-difference-between-catch-a-generic-exception-and-a -具体)。捕获泛型异常将导致处理您的代码未准备好的场景的可能性,在这种情况下可能是正确的。 – 2011-05-30 07:39:24

回答

4

以下是可能发生的情况。您声明了方法saveUser() @Transactional,但是您从createSchema()(不是@Transactional)调用它。因此,您实际上调用的不是代理方法saveUser(),并且失败。您最好在这里拍摄使用HibernateTemplate。由于createSchema()是init方法@Transactional可能不适用于它。

另请注意,接口上的@Transactional将不起作用。

+0

谢谢。你是对的,你使用HibernateTemplate的建议工作,但之后与相同的配置我得到java.lang.IllegalArgumentException:'transactionAttributeSource'或'transactionAttributes'是必需的:如果没有事务性方法,那么不要使用交易方面。你能帮我解决这个问题吗? – 2011-05-30 08:03:56

+0

它解决了,因为我使用TransactionProxyFactoryBean创建id =“ems”的bean,但没有使用任何transactionAttributes。添加这些问题解决后的属性。非常感谢你 – 2011-05-30 08:12:58