【发布时间】:2011-09-14 17:16:43
【问题描述】:
我想看看是否已经有类似的问题,但找不到,在这里。
我们有一个遗留代码,其中单个 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 的实例并调用 insertData(), 在它注解的类的方法被执行之后,通过使用aop:after,使得给定的
@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() 插入的数据吗?
多谢提前~!!
【问题讨论】:
标签: java spring annotations aop transactional