rollback transaction与Spring MVC + Hibernate中的多个会话相关联

时间:2013-08-23 06:08:15

标签: hibernate session spring-mvc rollback

我使用Spring MVC + Hibernate ,以下是泛型方法进行保存(一对多)。 我使用它来插入具有相同会话的两个表的记录,如果任何一个表失败,则所有操作滚动beck因为它们与同一会话相关联

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

在控制器中

@Resource(name = "PersistenceTemplate")
private PersistenceTemplate pt;
long getGenVal=pt.save(purchaseReq,list);

现在我想维护审核日志,为此我在同一个方法中添加另一个参数(保存)以将此操作与同一个会话关联起来,这样如果有3个表的任何表,则会产生问题。然后事务自动回滚。 (春天特写)

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

所以这三个操作都与同一个会话相关联

但不是我有问题,因为审计跟踪(日志)实体需要新插入记录的ID ,如(在控制器中)

purchaseReqAT= new ProPurchReqATModel("NEW REQUISION", "INSERT", 1, userId, userIp, sysdate);
INSERT和userId之间的

[“INSERT”,1,userId] 1是新生成的 ID (PK)

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

public <T> long save(T auditTrail) throws DataAccessException {
    Session session = sessionFactory.getCurrentSession();
    long getGenVal=(Long) session.save(auditTrail);
    return getGenVal;
}

并且审计跟踪无法在表中插入记录,如何回滚所有以前的事务?以及我们如何在同一方法中将新生成的ID与审计试验相关联。

任何解决方案?

1 个答案:

答案 0 :(得分:0)

您应该有一个包含此服务的服务层,服务层应该是事务层。该服务应该调用不同的存储库/ daos,这样一切都发生在一个事务中。

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

但是,为了编写审计记录,我会写一个hibernate interceptor,这样编写审计记录是透明的,你不要忘记将它包含在数据修改记录中。