У меня есть приложение, которое уже использует Spring Framework и Spring JDBC со слоем DAO, используя классы SimpleJdbcTemplate и 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 и DAO учетной записи совместно используют один и тот же экземпляр DataSource (в нашем случае это пул соединений), любой доступ к базе данных осуществляется через другое соединение.
Если иерархия объектов имеет глубину даже три уровня, использование этой реализации приводит к (a) многим вызовам со стороны платформы для datasource.getConnection () и (2) еще хуже, поскольку мы ограничиваем количество соединенийразрешено в нашем пуле соединений потенциальные условия гонки, когда несколько потоков пытаются загрузить проект из базы данных.
Есть ли лучший способ в Spring (без другого полноценного инструмента ORM) добиться загрузки такихиерархии объектов?
Спасибо, Пол