Я хотел знать то, что сообщество рассматривает "лучшими практиками" относительно отображения иерархий классов с Spring JDBC.
У нас нет способности использовать абсолютный инструмент ORM, однако мы используем Spring JDBC для облегчения части утомительной природы JDBC. Одним классом, который мы усиливаем очень регулярно, является BeanPropertyRowMapper, поскольку это - простота использования и способность иметь тип нечувствительный доступ свойства компонента от нашего набора результатов.
У меня есть иерархия классов что все карты назад к единственной таблице (проявляющий table-per-hiearchy подход для этой небольшой иерархии классов). По сути, таблица содержит classId столбец, который может использоваться для определения, какой класс нужно на самом деле инстанцировать.напр. 1 = менеджер, 2 = Сотрудник, 3 = Подрядчик. Все они являются "Людьми", но каждый подкласс человека имеет несколько атрибутов, которые уникальны для их класса.
Моя начальная буква думала, должен создать подкласс BeanPropertyRowMapper и попытаться ввести эту логику для высказывания, "если столбец A = 1 затем инстанцирует менеджера и затем делает привязку nomral".
Это походит на разумный подход? Есть ли какие-либо другие люди предложений, может иметь, которые работали на Вас?
Не похоже, что есть место в подклассе где вы можете добавить ловушку для переключения класса без полного копирования реализации mapRow () для BeanPropertyRowMapper. Лучшим подходом может быть создание класса RowMapper, который делегирует соответствующий BeanPropertyRowMapper.
Например:
final RowMapper managerMapper = new BeanPropertyRowMapper(Manager.class);
final RowMapper employeeMapper = new BeanPropertyRowMapper(Employee.class);
final RowMapper contractorMapper = new BeanPropertyRowMapper(Contractor.class);
RowMapper rm = new RowMapper()
{
@Override
public Object mapRow(ResultSet rs, int rowNum)
throws SQLException
{
int employeeType = rs.getInt("type");
switch (employeeType)
{
case 1:
return managerMapper.mapRow(rs, rowNum);
case 2:
return employeeMapper.mapRow(rs, rowNum);
case 3:
return contractorMapper.mapRow(rs, rowNum);
default:
break;
}
}
};