38

私が取り組んでいるプロジェクトは、次のような構造になっていDAOsます。

/** 
* Base DAO class
*/
@Transactional    
public class JPABase {

  @PersistenceContext
  private EntityManager entityManager;

  public void persist(Object entity) {
    entityManager.persist(entity);
  }
 //some more methods in here
}

/** 
* Generic DAO class implementation
*/
@Transactional 
public abstract class GenericDao extends JpaBase {
   //some methods in here
}

/** 
* Specialized DAO class
*/
@Repository
@Transactional
public class PersonDao extends GenericDao {
  //some methods in here
}

これまで、プロジェクトはコンパイル時ウィービングを使用<context:load-time-weaver/>していましたが、構成が変更され、 -javaagent:/opt/tomcat7-1/lib/spring-instrument.jar.

この変更が適用されたため、JpaBaseGenericDao@Transactional注釈は織り込まれなくなりました。サービス クラスがオブジェクトのpersistメソッドを呼び出すたびに、トランザクションは開始されません。PersonDao

注目すべき:

  • これは、コンパイル時のウィービングを使用するときに、過去に機能していました。
  • で定義されているすべてのメソッドはPersonDao正しく織り込まれていますが、継承されたもの (例: persist(Object entity)) は織り込まれていません。

コンパイル時ウィービングとロード時ウィービングは同じことを行うことになっていますが、異なる時点で行われます。織り方が変わったのはなぜですか?

4

2 に答える 2