現在、プロジェクトで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){
}
}
次に、テスト作業、データがデータベースに挿入されます。
- なぜこれが起こっているのか、誰でも説明できます。GlobalAbstractTransaction で既に定義されているため、SomeTransaction.execute に @Transactional を追加できません。代わりに @Transactional add class level を追加できますか?
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トランザクションを使用したトランザクションの問題について実際によく説明している良いリンクを持っている人
誰でもこれについて経験がありますか、またはより良いデザインパターンソリューションを持っていますか? ありがとう