私はSpring MVC + Hibernateを使用しています。以下は保存の一般的な方法です(1対多)。これを使用して、同じセッションで両方のテーブルのレコードを挿入します。いずれかのテーブルが失敗した場合、同じセッションに関連付けられているため、すべての操作がロールバックされます
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;
}
したがって、3 つの操作はすべて同じセッションに関連付けられます
しかし、監査証跡 (ログ) エンティティには、(コントローラー内) などの新しく挿入されたレコードの 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 を同じメソッド内で監査トライアルに関連付ける方法。
解決策はありますか?