1

このようなクラスの階層があります

public class AccessHistoryJpaDAO extends PaginatedJpaDAO<AccessHistory, Long>
implements AccessHistoryDAO

AccessHistoryJpaDAO に AccessHistoryDAO インターフェースで宣言されている logIn メソッドを実装しました。

public void logIn(AccessHistory entity) throws DAOException
{
    super.save(entity);     
}

次に、春のAuthenticationProcessingFilterを拡張します

パブリック クラス CustomAuthenticatingFilter は AuthenticationProcessingFilter を拡張します

およびオーバーライドされたメソッド

@Override
public Authentication attemptAuthentication(HttpServletRequest request)
        throws AuthenticationException

私が呼び出すとき、このメソッドで

getAccessHistoryDAO().logIn(entity);

hibernate はエンティティを永続化できませんが、direclty を呼び出すと

getAccessHistoryDAO().save(entity)

上記のメソッドはエンティティを永続化します。まあ、私はそれを理解しようとしますが、手がかりはありません。どんな助けも大歓迎です。ありがとうございました。

4

1 に答える 1

0

Proxy-AOPに関する非常によく知られている問題のようです。

@Transactionalメソッドにアノテーションがあると思いますsave。ただし、このアノテーションは、メソッドが他のSpringBeanから呼び出された場合にのみ考慮されます。同じSpringBean(this.save())から呼び出された場合、AOPプロキシは呼び出されないため、トランザクションは開始されません。

この問題は、少なくとも3つの異なる方法で処理できます。

  • メソッドに追加の@Transactionalアノテーションを付けるlogIn、または
  • 宣言型ではなく明示的なトランザクション管理を使用し、
  • Spring Proxy-AOPの代わりに実際のAspectJを使用します(これが私が行うことです)
于 2012-04-17T11:46:54.857 に答える