1

現在、プロジェクトでSpring + JPA + hibernateを使用しています。次に、モデルとDAOの実装でデザインパターンを決定します。すべてのトランザクション目的クラスの要約があります。単一の更新/作成/削除タスクを実行するすべてのクラス (サービスとして) は、この抽象クラスから継承する必要があります。

public class GlobalAbstractTransaction {
 public abstract void validation(DTO param);
 public abstract void process(DTO param);
 public void execute(DTO param){
     validation(param);
     process(param);
 }
}

次に、別のクラス(上記のクラスのサブクラス)があります

@Service
@Transactional //using spring annotation for transactional support
public class SomeTransaction extends GlobalAbstractTransaction
                           implements ITransaction {
     //implements abstract method
     public void validation(DTO param){
     }
     //implements abstract method
     public void process(DTO param){
     }
}

BusinessTransaction は、1 つのメソッドを持つインターフェースです。

public interface ITransaction {
     public execute(DTO param);
}

@Transactional (デフォルトでは Propagation.REQUIRED) をクラス SomeTransaction に配置することで、このクラスがトランザクション内にあることを確認したいことに注意してください。

IntegrationTestで使用する場合

@Autowired //default by name
ITransaction someTransaction;

@Test
public void testInsert(){
       DTO someDTO = new DTO(); 
       //apply value for DTO
       someTransaction.execute(someDTO);
}

その結果、トランザクションは発生しませんでした。また、データをデータベースに挿入するタスクのみを実行する someTransaction.execute がうまく動作していませんでした。

次に、@Transactional アノテーションを SomeTransaction から GlobalAbstractTransaction に移動して、コードが次のようになるようにします。

変更された GlobalAbstractTransaction

public class GlobalAbstractTransaction {
 public abstract void validation(DTO param);
 public abstract void process(DTO param);

 @Transactional //added here
 public void execute(DTO param){
     validation(param);
     process(param);
 }
}

変更された SomeTransaction

@Service
//transactional annotation removed
public class SomeTransaction extends GlobalAbstractTransaction
                           implements ITransaction {
     //implements abstract method
     public void validation(DTO param){
     }
     //implements abstract method
     public void process(DTO param){
     }
}

次に、テスト作業、データがデータベースに挿入されます。

  1. なぜこれが起こっているのか、誰でも説明できます。GlobalAbstractTransaction で既に定義されているため、SomeTransaction.execute に @Transactional を追加できません。代わりに @Transactional add class level を追加できますか?
  2. SomeTransaction はサービスとして計画されており、サービス内でオートワイヤーを使用して DAO 実装をオートワイヤーしました (DAO レベルで @Transactional を配置しません)。これがほとんどの人が推奨する方法です。DAO 実装に @Repository、サービス クラスに @Service という注釈を付けました。(私のサービスでは、InsertingService、UpdatingService、DeletingService という 1 つのタスクのみを実行することに注意してください。これらは 3 つのクラスに分けられます)。Service Facade ([http://java.dzone.com/articles/jpa-implementation-patterns-3][1]) の別のレイヤーを追加する予定です。参照用のリンクを参照してください。だから私はクラスを作成します

    public class ServiceFacadeBean { public void executeTransaction(文字列名) {

    } }

このようなアプリケーションで使用することを意図しています。

 @Autowired //injected using Spring autowiring
 ServiceFacadeBean serviceFacadeBean;

 serviceFacadeBean.execute("com.mycompany.SomeTransaction");

実行の実装では、「com.mycompany.SomeTransaction」を使用してリフレクションを使用してインスタンスを作成したいと考えています。しかし、私は常にNullPointerExceptionを取得します

 Class clazz = Class.forName("com.mycompany.SomeTransaction");

 clazz.newInstance() <--- get null

そして、1 つのサービス クラスで、データベースへの挿入などの 1 つのトランザクション タスクのみを実行することを意図しています。@Transactionalを配置するためのベストプラクティス、またはSpringトランザクションを使用したトランザクションの問題について実際によく説明している良いリンクを持っている人

誰でもこれについて経験がありますか、またはより良いデザインパターンソリューションを持っていますか? ありがとう

4

1 に答える 1

1

あなたが実装しているものとまったく同じアーキテクチャを使用しているジャカルタのソフトウェア会社と連絡を取り合っています。単一のタスクを実行し、単一の DTO をパラメーターとして受け取る BusinessTransactions があります。Bean も Spring 3.0 を使用して管理され、永続化は JPA 2 と Hibernate で行われます。NullPointerExecution に関しては、リフレクションも ServiceFacadeBean も使用しないでください。ただし、BusinessTransactions を次のような名前の Bean にします。

@Service("SomeTransaction")
//transactional annotation removed
public class SomeTransaction extends AbstractTransaction
                       implements ITransaction {
....
}

このトランザクションを実行する必要があるときはいつでも、次のように挿入します。

@Autowired
@Qualifier("SomeTransaction")
ITransaction someTransaction;

public doSomething() {
    DTO dto = new DTO();
    dto.putString("id", "948392943");
    someTransaction.execute(dto);
}

PS: 今ジャカルタにいるので、あなたに連絡する方法はありますか? ITの経験をあなたと直接共有することは非常に興味深いでしょう.

于 2011-05-11T10:10:33.057 に答える