Java 对多个dao方法的服务调用
我的服务级别如下:Java 对多个dao方法的服务调用,java,spring,transactions,ibatis,Java,Spring,Transactions,Ibatis,我的服务级别如下: @Transactional @Component(value = "userServiceImpl") public class UserServiceImpl implements UserService { @Autowired private UserDao userDaoiBatis; public boolean X() { // Call UserDao.A and UserDao.B in transactio
@Transactional
@Component(value = "userServiceImpl")
public class UserServiceImpl implements UserService
{
@Autowired
private UserDao userDaoiBatis;
public boolean X()
{
// Call UserDao.A and UserDao.B in transaction.
}
}
@Transactional
@Component(value = "userDaoiBatis")
public class UserDaoiBatis extends SqlMapClientDaoSupport implements UserDao
{
@Autowired
private void injectSqlMapClient(SqlMapClient sqlMapClient)
{
setSqlMapClient(sqlMapClient);
}
@Override
public boolean A()
{
throw new RuntimeException("Not implemented");
}
@Override
public boolean B()
{
throw new RuntimeException("Not implemented");
}
}
和一个Dao类,如下所示:
@Transactional
@Component(value = "userServiceImpl")
public class UserServiceImpl implements UserService
{
@Autowired
private UserDao userDaoiBatis;
public boolean X()
{
// Call UserDao.A and UserDao.B in transaction.
}
}
@Transactional
@Component(value = "userDaoiBatis")
public class UserDaoiBatis extends SqlMapClientDaoSupport implements UserDao
{
@Autowired
private void injectSqlMapClient(SqlMapClient sqlMapClient)
{
setSqlMapClient(sqlMapClient);
}
@Override
public boolean A()
{
throw new RuntimeException("Not implemented");
}
@Override
public boolean B()
{
throw new RuntimeException("Not implemented");
}
}
如何在userServiceImpl.Z()中作为事务的一部分调用UserDaoiBatis.A()和UserDaoiBatis.B()?您的设置看起来是正确的。事务将由
userserviceinpl
启动,然后对UserDaoiBatis
的两个调用将继承现有事务(@Transactional
默认为需要传播)。您可以通过在AbstractPlatformTransactionManager
类上启用调试级日志来确认这一点
请注意,如果
A()
抛出异常,tx将回滚。谢谢您,先生,只需要确认。+1请注意,您通常并不希望DAO方法是@Transactional的。请理解,并非我的DAO都是事务性的。只有少数几个可能会预期到传入事务。或者我遗漏了什么?自从调用服务启动事务以来,DAO上不必有@Transactional。但是,它是一个很好的安全网,以防你直接调用DAO。如果要确保不直接调用DAO,可以将DAO tx级别设置为强制,如果tx尚未运行,则会引发异常。