Java I';在提交事务时,我对hibernate和mysql感到困惑
我面临一个问题,当我使用hibernate+spring+mysql将数据从页面提交到数据库时,事务没有提交。或者我的配置有问题 以下是我的配置和代码: 1.spring config.xml(spring的配置) 3.UserService.javaJava I';在提交事务时,我对hibernate和mysql感到困惑,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我面临一个问题,当我使用hibernate+spring+mysql将数据从页面提交到数据库时,事务没有提交。或者我的配置有问题 以下是我的配置和代码: 1.spring config.xml(spring的配置) 3.UserService.java @Service public class UserService { @Resource private UserDao userDao; @org.springframework.transaction.annot
@Service
public class UserService {
@Resource
private UserDao userDao;
@org.springframework.transaction.annotation.Transactional
public boolean createUser(User user) {
try {
user.setId(String.valueOf(new Date().getTime()));
userDao.add(user);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
4.UserDao.java
@Repository
public class UserDao extends BaseDao<User, String>{
public UserDao() {
super(User.class);
}
}
@存储库
公共类UserDao扩展了BaseDao{
公共用户dao(){
super(User.class);
}
}
5.BaseDao.java
public abstract class BaseDao<T, PK extends Serializable> {
private SessionFactory sessionFactory;
private Class<T> cls;
public BaseDao(Class<T> t) {
cls = t;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//@Transactional
public void add(T t) throws Exception {
sessionFactory.getCurrentSession().save(t);
//sessionFactory.getCurrentSession().flush();
}
}
公共抽象类BaseDao{
私人会话工厂会话工厂;
私家车;
公共BaseDao(t类){
cls=t;
}
public SessionFactory getSessionFactory(){
返回工厂;
}
@资源
public void setSessionFactory(SessionFactory SessionFactory){
this.sessionFactory=sessionFactory;
}
//@交易的
公共void add(T)引发异常{
sessionFactory.getCurrentSession().save(t);
//sessionFactory.getCurrentSession().flush();
}
}
上面的代码只是一个测试代码,但不能持久保存到数据库。当然,如果我使用session.flush()
,它可以提交到数据库,但我认为这不是一个好方法,因为它无法确保事务的一致性
因此,我很困惑我的测试和代码到底出了什么问题。尝试在
spring config.xml
文件中更改事务配置:
<!-- Enable Annotation based Declarative Transaction Management -->
<tx:annotation-driven proxy-target-class="true"
transaction-manager="transactionManager" />
定义事务管理器使用此
而不是
它对您来说很好。这是我的@controller
,谢谢大家
@RequestMapping(value = "/user/edit")
public String edit(User user) {
if (user != null) {
if (StringUtils.isNotBlank(user.getId())) {
System.out.println(userService.editUser(user));
} else {
System.out.println(userService.createUser(user));
}
}
return "";
}
当然,如果我使用session.flush(),它可以提交到数据库,但是
我认为这不是一个好方法,因为它不能确保一致性
这是交易的一部分
如果调用flush(),则说明一切都有效,这一事实与flush()一样奇怪提交()
通过调用flush(),您所做的只是要求JPA提供者立即向数据库写入任何挂起的更新,而不是在事务提交时。虽然在某些情况下可能需要显式调用flush(),但通常不需要这样做,因为JPA提供程序将在尝试提交事务之前刷新任何挂起的更新。需要注意的关键点是,即使在调用flush之后,在提交和调用flush不会破坏事务的完整性之前,其他事务也不会看到您的更新
正如我上面提到的,您的代码很可能很好,但您的问题是理解错误 我的mysql的引擎是InnoDBPlease,请将帖子最小化以使其更具可读性。此外,请检查更新的标题并修复它,以便准确地总结您的问题。您需要使用@Transactional.com注释您的方法,以便清楚地说明:观察到的行为是什么?您是否收到某种类型的错误消息或异常,或者您只是希望数据库中没有行?它为事务管理器启用代理类,
在spring 3之前是完全正常的,但是spring 4需要更改它。您应该在回答中解释这一点,并提供一些链接来备份它。@RequestMapping(value=“/user/edit”,method=RequestMethod.POST,headers=“Accept=application/xml,application/json”)
将方法类型定义为POST、GET、DELETE、UPDATE和headers value,并在服务层中使用@Autowired
而不是@Resource
。[请检查链接。
<!-- Enable Annotation based Declarative Transaction Management -->
<tx:annotation-driven proxy-target-class="true"
transaction-manager="transactionManager" />
@RequestMapping(value = "/user/edit")
public String edit(User user) {
if (user != null) {
if (StringUtils.isNotBlank(user.getId())) {
System.out.println(userService.editUser(user));
} else {
System.out.println(userService.createUser(user));
}
}
return "";
}