2015-01-30 3 views
0

Я использую Spring с Hibernate. Я использую следующие конфигурации. Когда я пытаюсь сохранить транзакцию Spring, запись никогда не совершает.Spring @Transactional не фиксирует записи

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

    <context:component-scan base-package="com.wpt.controllers,com.wpt.dao" /> 

    <mvc:annotation-driven /> 

    <mvc:default-servlet-handler /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean id="wptDatasource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/wp" /> 
     <property name="username" value="user" /> 
     <property name="password" value="pass" /> 
    </bean> 
    <bean id="hibernate4AnnotatedSessionFactory" 
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
      <property name="dataSource" ref="wptDatasource" /> 
      <property name="packagesToScan" value="com.wpt.models" /> 
      <property name="hibernateProperties"> 
       <props> 
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
        <prop key="hibernate.current_session_context_class">thread</prop> 
        <prop key="hibernate.show_sql">false</prop> 
       </props> 
      </property> 
     </bean> 

     <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
      p:sessionFactory-ref="hibernate4AnnotatedSessionFactory"> 
     </bean></beans> 

MyControllerClass

@Transactional 
@RequestMapping(...) 
public String saveRecords(@ModelAttribute("orderObj") Order order){ 
    for(Item item : order.getItems()){ 
    itemDAO.save(item); 
    } 
    return "saveSuccess"; 
} 

MyDAOClass

public void save(Item item){ 
    session = sf.openSession(); 
    session.save(item); 
    session.close(); 
} 

выше @Transactional конфигурация не совершает запись. Но если я удалю @Transactional из контроллера Spring и использую транзакцию Hibernate, как показано ниже, запись фиксируется.

public void save(Item item){ 
    session = sf.openSession(); 
    Transaction tx = session.beginTransaction(); 
    session.persist(item); 
    tx.commit(); 
    session.close(); 
} 

Этот класс фиксирует запись. Я прошел через некоторые форумы, и было упомянуто, что @Transactional позаботится о фиксации записей. Какую ошибку я здесь делаю? Может кто-нибудь помочь?

Заранее спасибо.

+0

У вас есть файл конфигурации пружин? – SMA

+0

Да, я дал sessionfactory и transactionmanagement beans в самом вопросе. Нужно ли здесь ставить весь файл? – svjn

+0

Да, пожалуйста, вставьте весну xml. – SMA

ответ

0

Он работал после того, как я добавил <tx:annotation-driven /> аннотация к моей конфигурации xml & удален hibernate.current_session_context_class из hibernateSessionFactory bean. Учитывая изменения ниже.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" 
    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" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<context:component-scan base-package="com.wpt.controllers,com.wpt.dao" /> 

<mvc:annotation-driven /> 

<mvc:default-servlet-handler /> 

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/views/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

<bean id="wptDatasource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/wp" /> 
    <property name="username" value="user" /> 
    <property name="password" value="pass" /> 
</bean> 
<bean id="hibernate4AnnotatedSessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="wptDatasource" /> 
     <property name="packagesToScan" value="com.wpt.models" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <!-- <prop key="hibernate.current_session_context_class">thread</prop> --> 
       <prop key="hibernate.show_sql">false</prop> 
      </props> 
     </property> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
     p:sessionFactory-ref="hibernate4AnnotatedSessionFactory"> 
    </bean> 
</beans> 

Затем я включил org.springframework.transaction.annotation.Transactional аннотации ко всем моим методам & обслуживания удалены все транзакции из моих классов DAO.

public void save(Item item){ 
    //session = sf.openSession(); 
    session.save(item); 
    //session.close(); 
} 

благодарит за вашу помощь.

+3

Вы не должны открывать сеанс самостоятельно и не закрывать их.Вы все еще не используете Spring, используйте 'sf.getCurrentSession(). Save (item)' вместо того, что у вас есть сейчас. –

+0

Да, я исправился. Большое спасибо. :) – svjn

Смежные вопросы