0

私は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 を同じメソッド内で監査トライアルに関連付ける方法。

解決策はありますか?

4

1 に答える 1

0

これを組み込んだサービス層が必要であり、サービス層はトランザクション層でなければなりません。サービスはさまざまなリポジトリ/daos を呼び出す必要があります。このようにして、すべてが単一のトランザクションで行われます。

また、コントローラー コードも簡素化されます (これは、Web 要求と、ビジネス ロジックを含むべきではないサービス メソッドの呼び出しとの間の単なる薄いレイヤーである必要があります)。

ただし、監査レコードを書き込むには、休止状態のインターセプターを作成します。そうすれば、監査レコードの書き込みは透過的になり、データ変更レコードに含めることを忘れることはありません。

于 2013-08-23T06:52:48.000 に答える