【发布时间】:2010-06-21 13:39:49
【问题描述】:
我有一个应用程序已经在使用 Spring Framework 和 Spring JDBC,并带有一个使用 SimpleJdbcTemplate 和 RowMapper 类的 DAO 层。对于从数据库中读取的小型类结构,这似乎非常有效。但是,我们需要加载保存其他对象集合的对象,这些对象仍然保存其他对象的集合。
这个问题的“明显”解决方案是创建一个命名的 RowMapper 类或我们的对象,并在构造函数中传递对正确 DAO 对象的引用。例如:
public class ProjectRowMapper implements ParameterizedRowMapper {
public ProjectRowMapper(AccountDAO accountDAO, ) {
this.accountDAO = accountDAO;
}
public Project mapRow(ResultSet rs, int rowNum) throws SQLException {
Project project= new Project ();
project.setProjecttId( rs.getString("project_id") );
project.setStartDate( rs.getDate("start_date") );
// project.setEtcetera(...);
// this is where the problems start
project.setAccounts( accountDAO.getAccountsOnProject(project.getProjectId()) );
}
}
问题在于,即使 ProjectDAO 和 Account DAO 共享同一个 DataSource 实例(在我们的例子中这是一个连接池),任何数据库访问都是通过不同的连接完成的。
如果对象层次结构甚至是三层深,使用此实现会导致 (a) 框架对 datasource.getConnection() 的多次调用,以及 (2) 更糟糕的是,由于我们限制了连接池中允许的连接数,当多个线程尝试从数据库加载项目时,可能会出现竞争条件。
在 Spring 中是否有更好的方法(没有另一个成熟的 ORM 工具)来实现此类对象层次结构的加载?
谢谢, 保罗
【问题讨论】:
-
一个成熟的 ORM 工具正是您所需要的。这些问题很难,不要重新发明它们。
-
您的代码周围有交易吗?我们使用相同的嵌套 dao 模式来加载复杂对象,但 Spring JDBC 只使用一个连接