2017-02-12 15 views
1

spring + hibernateを使用するとHQL文はロールバックされませんが、session.saveOrUpdate()になります。spring-hibernateトランザクションロールバックしません

UserServiceの

@Service 
@Transactional(rollbackFor=Exception.class) 
public class UserService { 

    @Autowired 
    private BaseDao dao; 

    public int updateTest(){ 
     int i = dao.updateUser(); 
     int t = 1/0; 
     return i; 
    } 
} 

BaseDao HQL文をサポートしていません

@Repository 
public class BaseDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    private Session getSession(){ 
     return sessionFactory.getCurrentSession(); 
    } 

    public int updateUser(){ 
     int i = 0; 
     /* String sql = "from Student where name = 'dengbojing'"; 
     Query query = this.getSession().createQuery(sql);*/ 
     Student s = new Student(); 
     s.setId(1); 
     s.setAddress("1"); 

     Query query = this.getSession().createQuery("update Student s set s.address = '1'"); 


     query.executeUpdate(); 

     //this.getSession().update(s); 
     return i; 
    } 

} 

Configurationクラス

@Configuration 
@EnableConfigurationProperties(HibernateProperties.class) 
@EnableTransactionManagement(proxyTargetClass=true) 
public class HibernateConfig { 
    @Autowired 
    private HibernateProperties config; 


    @Bean(name="sessionFactory") 
    public LocalSessionFactoryBean localSessionFactoryBean(){ 
     LocalSessionFactoryBean bean = new LocalSessionFactoryBean(); 
     bean.setDataSource(dataSource()); 
     bean.setHibernateProperties(config.getHibernateProperties()); 
     bean.setPackagesToScan(config.getPackageToScan()); 
     return bean; 
    } 

    @Bean 
    public DataSource dataSource(){ 
     DruidDataSource source = new DruidDataSource(); 
     source.setDriverClassName(config.getDatasource().getDriverClassName()); 
     source.setUsername(config.getDatasource().getUsername()); 
     source.setUrl(config.getDatasource().getUrl()); 
     source.setPassword(config.getDatasource().getPassword()); 
     return source; 
    } 

    @Bean 
    public HibernateTransactionManager txManager(){ 
     HibernateTransactionManager manager = new HibernateTransactionManager(); 
     manager.setSessionFactory(localSessionFactoryBean().getObject()); 
     manager.setDataSource(dataSource()); 
     return manager; 
    } 

} 

春のトランザクション、問題plag私は2日間私に尋ねた、私は同様の問題を抱えている人を見たが、問題を解決しなかった

+0

私はいくつかのテストを行い、それは私のために働いた..あなたの春/ hibバージョンは何ですか? –

+0

本当ですか?あなたのコードを通過できますか? spring 4.2.5と4.3.11 – Deng

+0

を休止してください。あなたがexecureUpdateを実行した後で例外をスローすると、更新はまだデータベースに残っていますか? –

答えて

0

私は全く同じバージョンと構成でいくつかのテストを行った。

私は更新がデータベースに永続化されないと言う必要があります。回避策として

、あなたはこの方法であなたの機能を実装することができるかどうか...にしてみてください:

  • 更新に必要なフィールド
  • が上の任意の他の方法を起動しないでください希望Personエンティティを探しますトランザクションオブジェクトの変更を更新するためにフレームワークに残すだけです。

executeUpate()を使用して明示的に一括更新のない

Person person = session.get(Person.class, 1); 

person.setAddress("1") 
// other fields updated 

return i; 

、暗黙的にはプロバイダによってコミットの見込みはありません。これは、理論的にはそれをチェックアウトです。

+0

ただし、excuteUpdate()を使用しない場合は、問題はありませんが、一部のシナリオでHQLまたはSQL文 – Deng

+0

を使用する必要がありますが、SQLまたはHQLを記述してトランザクションが機能しない、または休止状態になるサポートしていない – Deng

+0

属性のロールバックを削除しようとしています...とにかくあなたのケースで重複しています –

関連する問題