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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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 Spring框架jdbcdao与aggration/composition_Java_Spring_Jdbc - Fatal编程技术网

Java Spring框架jdbcdao与aggration/composition

Java Spring框架jdbcdao与aggration/composition,java,spring,jdbc,Java,Spring,Jdbc,我有一个应用程序已经在使用Spring框架和Spring JDBC,其中DAO层使用SimpleJDCtemplate和RowMapper类。对于从数据库读取的小型类结构,这似乎非常有效。但是,我们需要加载包含其他对象集合的对象,这些对象仍然包含其他对象的集合 这个问题的“明显”解决方案是创建一个命名的RowMapper类或我们的对象,并在构造函数中传递对适当DAO对象的引用。例如: public class ProjectRowMapper implements ParameterizedRo

我有一个应用程序已经在使用Spring框架和Spring JDBC,其中DAO层使用SimpleJDCtemplate和RowMapper类。对于从数据库读取的小型类结构,这似乎非常有效。但是,我们需要加载包含其他对象集合的对象,这些对象仍然包含其他对象的集合

这个问题的“明显”解决方案是创建一个命名的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和accountdao共享同一个数据源实例(在我们的例子中,这是一个连接池),任何数据库访问都是通过不同的连接完成的

如果对象层次结构甚至有三层,那么使用此实现将导致 (a) 框架对datasource.getConnection()的多次调用,以及 (2) 更糟糕的是,由于我们限制了连接池中允许的连接数,当多个线程试图从数据库加载项目时,可能会出现争用情况

Spring中是否有更好的方法(没有另一个成熟的ORM工具)来实现此类对象层次结构的加载

谢谢,
Paul

我想您有理由不使用ORM,它是解决此类问题的理想工具

多个连接的问题是对另一个DAO的递归调用。为了避免消耗额外的连接,应在获取项目实例之后检索帐户对象。在获取项目时,AccountID也会被获取,但不会“实例化”到account实例——它们仍然是一个ID列表,在项目DAO完成其工作后会填充这些ID

例如,您可以构建一个自定义列表类型,该类型接受ID列表和DAO实现。该列表仅使用ProjectRowMapper中的ID填充,并分配给项目的accounts属性。ID对列表是私有的-它们不是列表的“内容”,而是以后生成真实内容的一种方法


一旦项目DAO从行映射器获取了项目,它就可以指示列表获取保存在列表中的ID的帐户。帐户是作为非嵌套操作获取的,因此整个过程在任何时候都只使用一个连接。然而,获取是在DAO方法的范围内完成的,因此获取是急切地完成的,因此没有延迟加载问题需要处理。

一个成熟的ORM工具正是您在这里需要的。这些问题是很难解决的,不要重复它们。你的代码中有任何事务吗?我们使用相同的嵌套dao模式加载复杂对象,但SpringJDBC只使用一个连接