Java I';在提交事务时,我对hibernate和mysql感到困惑

Java 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

我面临一个问题,当我使用hibernate+spring+mysql将数据从页面提交到数据库时,事务没有提交。或者我的配置有问题

以下是我的配置和代码:

1.spring config.xml(spring的配置)

3.UserService.java

@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 "";
}