2017-02-06 10 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.xmlの春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> 

私が持っているWebアプリケーションに取り組んでいますユーザー入力EmployeeBenefitsフォーム。 データベースからEmployeeBenefitsオブジェクトを取得しようとしていて、オブジェクトを変更して再度保存しようとしています。アプリケーションの観点から見ると、データが保存されているようで、List Allボタンをクリックしてすべてのデータを取得すると、変更されたデータが表示されます。しかし、データは決してデータベースで更新されません。 保存されたオブジェクトは、休止状態のセッションのどこかにキャッシュされますが、データベースには移動しません。 助けてください。

ログレベルをトレースに設定すると、トランザクションが実際にコミットされていることがわかりました。なぜデータベーステーブルが更新されないのか分かりません。 これは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]] 

@Transactionalアノテーションに(value = "springTransactionManager")を追加して問題を解決しました。 問題は、私はHibernateTransactionManagerが

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

春@Transactionalは、その性質を持つことによって動作しませんでしたスレッドからセッションを取得するように設定された設定されていました。 だから私は2つのトランザクションマネージャを有することにより、新たなTransactionalMangaer

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

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

<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のWi予選は私が望んでいた正しいものを拾わなかった。ありがとう。

+0

セッションでフラッシュします。または、既に実装済みのバネデータに切り替えることもできます。 –

+0

@ fer.marinoありがとうございますが、今すぐスプリングデータに切り替えることはできません。しかし、私はそれがうまくいかなかったフラッシュを試みた。その他の提案はありますか?セッションセッション= springSessionCtxFactory.getCurrentSession(); session.saveOrUpdate(benefitRates); session.flush(); – Ravi

+0

まず第一に、@Componentをあなたのインターフェースに置く必要はないと思う。 –

答えて

0

あなたは正しくない@Transactional注釈を使用している可能性があります。 SpringとJPAには独自のバージョンがあります。

+0

私はSpring @Transactionalを使って手動コミットせずに保存/更新しようとしています。データベースからのデータのフェッチは機能していますが、操作の保存/更新はできません。 – Ravi

関連する問題