抽象クラスからコア機能を継承する一連の@Service
があります。私は@Service
と@Transactional
という具体的なサブクラスサービスをそれぞれマークしました。抽象スーパークラスには、これらの各サービスの公開エントリポイントメソッドが含まれています。換言すれば、私は、次のようなものがある:Spring @トランザクションの継承規則
abstract class AbstractService {
public void process() {
// Do common initialisation code here
processSpecific();
// Do common completion code here
}
abstract protected void processSpecific();
}
@Service @Transactional
public class FirstSpecificService extends AbstractService {
protected void processSpecific() {
// Do specific processing code here
}
}
@Service @Transactional
public class SecondSpecificService extends AbstractService {
protected void processSpecific() {
// Do different specific processing code here
}
}
各具象サブクラスのサービスに固有のコードは、トランザクションの伝搬としてREQUIRED
を有するデータベースに変更を加えるためにDAO層に複数の呼び出しを行いますタイプ。
上記のように定義されたサービスでは、これらの具体的なサブクラスサービスのコード内に現在のトランザクションがなく、DAOレイヤーへの各呼び出しで新しいトランザクションが作成され、トランザクションをコミットして戻ります。私は@Transactional
と抽象スーパークラスに注釈を付ける場合
しかし、そのトランザクションが正しく作成さであり、DAO層にサブの呼び出しはすべて、現在のトランザクションに参加しています。
私の質問は、@Transactional
の動作を継承するためのルールは何ですか? Springが実際にインスタンス化している具体的なサブクラスサービスで@Transactional
を使用しないのはなぜですか?この場合、@Transactional
はスーパークラスにある必要があります。なぜなら、これは公開エントリーポイント方式がどこにあるのかということです。
ちなみに、[関連するSpringSourceのドキュメント](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework)を見てきました。 -reference.html#transaction-declarative-annotations)、これはこれをカバーしていないようです。 – DuncanKinnear