我使用Spring 4.2.3和Hibernate 5.0.6开发了一个Spring MVC应用程序。在我们的一些测试中,我们发现我们的一些数据没有保存到数据库(Oracle)。代码如下:
@Service
@Transactional
public class MyService {
@Autowired
private MyDao dao;
public void saveCustomer(Customer c) {
dao.saveCustomer(c);
}
}
@Repository
@Transactional
public class MyDao {
@Autowired
private SessionFactory sessionFactory; // Hibernate's SessionFactory
public void saveCustomer(Customer cust) {
sessionFactory.getCurrentSession().clear();
sessionFactory.getCurrentSession().flush();
sessionFactory.getCurrentSession().save(cust);
}
}
说实话,我刚刚在MyDao上看到了@Transactional,因为我正在写这篇文章。这可能是错的,因为@Transactional已经在服务层上了。
我们正在使用Java Config ....显示相关的bean ....
@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan({"my.package"})
public class Config extends WebMvcConfigurerAdapter {
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(ComboPooledDataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.scanPackages("my.entities");
sessionBuilder.addProperties(getHibernateProperties());
return sessionBuilder.buildSessionFactory();
}
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
return transactionManager;
}
}
我的问题是,除了MyDao上的@Transactional,它不应该存在,对于为什么客户不保存到数据库,还有什么能让人高兴吗?我们甚至正确地进行交易吗?我从来不喜欢使用Hibernate的SessionFactory,但这就是我们的方式。我们是否在Spring Transaction中正确使用它?
谢谢!
克里斯