我正在做一个项目,人们不喝 Spring kool-aid...我发现下面的模式对我很有效...
Service-->*Manager-->DAOs
假设您有 3 个不同的表必须在单个事务中更新(全有或全无)。其中一个表是“父”表,其中子表必须在父保存期间更新。
public class ParentServive
private ParentManager parentManager;
public void save(Parent parent){
parentManager.save(parent)
}
}
创建一个所有 *Manager 类都可以扩展的 DAOManager
public class DAOManager{
...
..
public Connection getConnection()throws DAOException{
try{
dataSource.getConnection();
}catch(SQLException e){
throw new DAOExceptoin(e);
}
}
public Connection getTXConnection()throws DAOException{
Connection connection = dataSource.connection;
connection.setAutoCommit(false);
return connection;
}
public void close(Connection connectoin) throws DAOException{
try{
if ( !connection.getAutoCommit() ){
connection.setAutoCommit(true);
}
connection.close();
}catch(SQLException e){
throw new DAOExceptoin(e);
}
}
}
现在您有两个 DAO,父表必须更新它们才能使保存有效,首先创建一个抽象 DAOManager
请注意,我只打开了一个连接,并且可以在所有表上回滚或提交...
public class ParentManager extends DAOManager{
private ParentDAO parentDAO;
private ChildOneDAO childOneDAO;
private ChildTwoDAO childTwoDAO;
public save(Parent parent) throw DAOException{
Connection connection = null;
try{
connection = getTXConnection();
ParentDAO parentDAO = new ParentDAO(connection);
ChildTwoDAO childTwoDAO = new ChildOneDAO(connection);
ChildTwoDAO childTwoDAO = new ChildTwoDAO(connection);
parentDAO.save(...)
childOneDAO.save(...)
childTwoDAO.save(..)
connection.commit();
}catch(Exception e){
connection.rollback();
}finally{
close(connection);
}
}
}
那么您的服务只能使用 Manager 类..而不用担心连接管理...每个“表”都有一个 Manager,而要使用的 DAO 是缺点。