微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 带有agrgegation / composition的Spring Framework JDBC DAO

我有一个应用程序已经使用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的递归调用.为避免消耗其他连接,应在获取项目实例后稍后检索Account对象.在获取项目时,也会获取accountID,但不会将其“实例化”到帐户实例 – 它们仍然是ID列表,然后在项目DAO完成工作后填充这些ID.

例如,您可以构建一个自定义List类型,该类型包含ID列表和DAO实现.该列表仅使用ProjectRowMapper中的ID填充并分配给项目的accounts属性.这些ID对列表是私有的 – 它们不是列表的“内容”,而是稍后生成实际内容的方法.

一旦Project DAO从RowMapper中获取了项目,它就可以指示列表然后获取列表中保存的ID的帐户.帐户被取为非嵌套操作,因此整个过程只使用一个连接.然而,获取是在DAO方法的范围内完成的,因此fetch急切地完成 – 因此没有懒惰加载问题需要处理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐