Hibernate 在Spring MVC+;中与多个会话关联的回滚事务;冬眠

Hibernate 在Spring MVC+;中与多个会话关联的回滚事务;冬眠,hibernate,session,spring-mvc,rollback,Hibernate,Session,Spring Mvc,Rollback,我正在使用SpringMVC+Hibernate,下面是保存(一对多)的通用方法我使用它插入具有相同会话的两个表的记录,如果任何一个表失败,则所有操作都将回滚,因为它们与相同会话关联 public <T, E> long save(T entity, List<E> list) throws DataAccessException { Session session = sessionFactory.getCurrentSession(); long g

我正在使用SpringMVC+Hibernate,下面是保存(一对多)的通用方法我使用它插入具有相同会话的两个表的记录,如果任何一个表失败,则所有操作都将回滚,因为它们与相同会话关联

public <T, E> long save(T entity, List<E> list) throws DataAccessException {

    Session session = sessionFactory.getCurrentSession();
    long getGenVal=(Long)session.save(entity);
    for(E getlist : list){
    session.save(getlist);
    }

    return getGenVal;
}
现在我想维护审核日志,为此,我在同一个方法(save)中添加了另一个参数,将此操作与同一个会话相关联,这样,如果有任何一个表包含3个表,就会产生问题。然后事务自动回滚。(弹簧特性)

[“插入”,1,用户ID]插入和用户ID之间的1是新生成的ID(主键)

如果我在获取新插入记录的id后创建一个单独的方法来保存审计跟踪。比如

public <T> long save(T auditTrail) throws DataAccessException {
    Session session = sessionFactory.getCurrentSession();
    long getGenVal=(Long) session.save(auditTrail);
    return getGenVal;
}
public long save(T auditTrail)抛出DataAccessException{
Session Session=sessionFactory.getCurrentSession();
long getGenVal=(long)session.save(auditTrail);
返回getGenVal;
}
并且audit trail无法在表中插入记录,如何回滚以前的所有事务?以及我们如何在同一方法中将新生成的ID与审计试用关联


有什么解决方案吗?

您应该有一个服务层,其中包含了这一层,而服务层应该是事务层。服务应该调用不同的存储库/DAO,这样所有事情都在一个事务中发生

它还简化了控制器代码(这应该只是web请求和服务方法调用之间的一层薄薄的代码,它不应该包含业务逻辑)

然而,对于编写审计记录,我将编写一个,这样编写审计记录是透明的,并且您不会忘记将其包括在数据修改记录中

public <T, E, K> long save(T entity, List<E> list, K audit) throws DataAccessException {

        Session session = sessionFactory.getCurrentSession();
        long getGenVal=(Long)session.save(entity);
        for(E getlist : list){
        session.save(getlist);
        }
        session.save(audit);
        return getGenVal;
    }
purchaseReqAT= new ProPurchReqATModel("NEW REQUISION", "INSERT", 1, userId, userIp, sysdate);
public <T> long save(T auditTrail) throws DataAccessException {
    Session session = sessionFactory.getCurrentSession();
    long getGenVal=(Long) session.save(auditTrail);
    return getGenVal;
}