Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对多个dao方法的服务调用_Java_Spring_Transactions_Ibatis - Fatal编程技术网

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尚未运行,则会引发异常。