@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予選は私が望んでいた正しいものを拾わなかった。ありがとう。
セッションでフラッシュします。または、既に実装済みのバネデータに切り替えることもできます。 –
@ fer.marinoありがとうございますが、今すぐスプリングデータに切り替えることはできません。しかし、私はそれがうまくいかなかったフラッシュを試みた。その他の提案はありますか?セッションセッション= springSessionCtxFactory.getCurrentSession(); session.saveOrUpdate(benefitRates); session.flush(); – Ravi
まず第一に、@Componentをあなたのインターフェースに置く必要はないと思う。 –