私はすでに同様の質問があるかどうかを確認しようとしていましたが、それを見つけることができませんでした、ここにあります。
単一のBOがリフレクションを使用して多くのDAOへのメソッド呼び出しを行うレガシーコードがあります。簡単にするためにコードを変更しました。
@Transactional
class EndpointData1DAO implements DAO{
void inserData() {
// insert data 1
}
}
@Transactional
class EndpointData2DAO implements DAO{
void inserData() {
// insert data 2
}
}
class MachoBO {
void handleEverything(String daoName) {
DAO dao = getDAOUsingReflection(daoName);
dao.insertData();
}
}
問題は、要件が変更されたため、EndpointData1DAOでinsertData()が呼び出されたときに、EndpointData2DAOのinsertDataも呼び出される必要があることです。
EndpointData2DAOをEndpointData1DAOのメンバーとして追加するだけでもかまいませんが、SRPに著しく違反し、見苦しくなります。
だから私はアノテーション@ExecuteAfter(clazz = EndpointData2DAO.class、method = "insertData")を書きました。これは、EndpointData2DAOのインスタンスを取得し、アノテーションを付けるクラスのメソッドが実行された後、aop:afterを使用してinsertData()を呼び出します。 、与えられたように
@Transactional
@ExecuteAfter(clazz=EndpointData2DAO.class, method="insertData")
class EndpointData1DAO implements DAO{
void inserData() {
System.out.println("insert1");
}
}
@Transactional
class EndpointData2DAO implements DAO{
void inserData() {
System.out.println("insert2");
}
}
class MachoBO {
void handleEverything(String daoName) {
DAO dao = getDAOUsingReflection(daoName);
dao.insertData();
}
1 2は、machoBO.handleEverthing( "Data1");を呼び出すと出力されます。
今私の質問は、EndpointData1DAOとEndpointData2DAOのinsertData()は同じ物理トランザクションにあるのでしょうか?つまり、EndpointData2DAOのinsertData()のランタイム例外は、EndpointData1DAOのinsertData()によって挿入されたデータをロールバックしますか?
よろしくお願いします〜!!