我正在使用 Spring MVC + 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;
}
在控制器中
@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", 1, userId] INSERT 和 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 与审计试验相关联。
任何解决方案?