2017-02-06 2 views
0
@Component 
public interface BenefitRateService { 
    void save(EmployeeBenefits benefitRates) throws Exception; 
} 

@Service(value="BenefitRateService") 
public class BenefitRateServiceImpl implements BenefitRateService { 

    @Transactional() 
    public void save(EmployeeBenefits benefitRates) throws Exception{ 
     try{ 
      benefitRateDao.save(benefitRates); 
     }catch(HibernateException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Component 
public interface BenefitRatesDao { 
    public void save(EmployeeBenefits benefitRates); 
} 

@Repository("BenefitRatesDao") 
public class BenefitRatesDAOImpl implements BenefitRatesDao { 

    @Autowired 
    private SessionFactory springSessionCtxFactory; 

    public void save(EmployeeBenefits benefitRates) throws Exception{ 

     Session session = springSessionCtxFactory.getCurrentSession(); 
     //session.beginTransaction(); 
     springSessionCtxFactory.getCurrentSession().saveOrUpdate(benefitRates);    
     //session.getTransaction().commit(); 
    } 
} 

весна-config.xmlSpring-Hibernate методы @Transactional службы автоматически не совершают

<tx:annotation-driven transaction-manager="springTransactionManager"/> 
<bean id="springTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
<property name="sessionFactory" ref="springSessionCtxFactory" /> 

<bean id="springSessionCtxFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     </props> 
    </property> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.benefits</value> 
     </list> 
    </property> 

Я работаю на веб-приложение, которое имеет пользовательская форма EmployeeBenefits. Я пытаюсь получить объект EmployeeBenefits из базы данных, изменить объект и сохранить его снова. С точки зрения приложения кажется, что данные сохраняются, и когда я извлекаю все данные, нажав кнопку «Список всех», я могу видеть измененные данные. Но дело в том, что данные никогда не обновляются в базе данных. Сохраненный объект кэшируется где-то в сеансе спящего режима, но никогда не идет в базу данных. Пожалуйста, помогите.

Установив уровень журнала на Trace, я обнаружил, что транзакция действительно совершена. Не знаю, почему таблица базы данных не обновляется. Это потому, что свойство hibernate.connection.autocommit не установлено в true?

2017-02-06 21:30:15,765 [org.springframework.orm.hibernate3.HibernateTransactionManager:365] DEBUG - Creating new transaction with name [com.vdh.budget.service.impl.BenefitRateServiceImpl.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''  
2017-02-06 21:30:15,786 [org.springframework.orm.hibernate3.HibernateTransactionManager:493] DEBUG - Opened new Session [[email protected]] for Hibernate transaction 
2017-02-06 21:30:15,788 [org.springframework.orm.hibernate3.HibernateTransactionManager:504] DEBUG - Preparing JDBC Connection of Hibernate Session [[email protected]] 
2017-02-06 21:30:15,796 [org.springframework.transaction.support.TransactionSynchronizationManager:183] DEBUG - Bound value [[email protected]] for key [[email protected]] to thread [main] 
2017-02-06 21:30:15,797 [org.springframework.transaction.support.TransactionSynchronizationManager:258] DEBUG - Initializing transaction synchronization 
2017-02-06 21:30:15,797 [org.springframework.transaction.interceptor.TransactionInterceptor:362] DEBUG - Getting transaction for [com.vdh.budget.service.impl.BenefitRateServiceImpl.save] 
2017-02-06 21:30:15,797 [org.springframework.orm.hibernate3.SessionFactoryUtils:316] DEBUG - Opening Hibernate Session 
2017-02-06 21:30:15,806 [org.hibernate.SQL:111] DEBUG - update benefits set amount =? where id =? 
2017-02-06 21:30:16,055 [org.springframework.transaction.interceptor.TransactionInterceptor:391] DEBUG - Completing transaction for [com.vdh.budget.service.impl.BenefitRateServiceImpl.save] 
2017-02-06 21:30:16,055 [org.springframework.orm.hibernate3.HibernateTransactionManager:925] DEBUG - Triggering beforeCommit synchronization 
2017-02-06 21:30:16,055 [org.springframework.orm.hibernate3.SessionFactoryUtils:144] DEBUG - Flushing Hibernate Session on transaction synchronization 
2017-02-06 21:30:16,170 [org.springframework.orm.hibernate3.HibernateTransactionManager:752] DEBUG - Initiating transaction commit 
2017-02-06 21:30:16,170 [org.springframework.orm.hibernate3.HibernateTransactionManager:652] DEBUG - Committing Hibernate transaction on Session [[email protected]] 

Я решил проблему путем добавления (значение = "springTransactionManager") для аннотации @Transactional. Проблема была у меня HibernateTransactionManager сконфигурировано, который был создан, чтобы получить сеанс из потока

<property name="hibernate.current_session_context_class">thread</property> 

Spring @Transactional не работал, имея эту собственность. Так я установил новый TransactionalMangaer

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

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

<tx:annotation-driven transaction-manager="hibernateTransactionManager"/> 
<tx:annotation-driven transaction-manager="springTransactionManager"/> 
<bean id="springSessionCtxFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext</prop> 
     </props> 
    </property> 

В классе обслуживания

@Transactional(value = "springTransactionManager"}) 
public void save(EmployeeBenefits benefitRates); 

При наличии двух менеджеров транзакций, @Transactional Wi Отборочный турнир не подобрал правильный, который я хотел. Благодарю.

+0

попробуйте выполнить флеш на сессии. Альтернативно переключитесь на весенние данные, в которых есть все, что вам нужно, уже реализовано. –

+0

@ fer.marino Спасибо, но сейчас я не могу переключиться на весенние данные. Однако я попытался промыть бу, это не сработало. Любые другие предложения? Session session = springSessionCtxFactory.getCurrentSession(); session.saveOrUpdate (BenefRates); session.flush(); – Ravi

+0

Прежде всего, я думаю, что вам не нужен put @Component на вашем интерфейсе –

ответ

0

Возможно, вы используете неправильную аннотацию @Transactional. У Spring и JPA есть свои версии.

+0

Я пытаюсь сохранить/обновить с помощью Spring @Transactional без ручной фиксации. Получение данных из базы данных работает, но не сохраняет/обновляет операции. – Ravi

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