Spring JDBC RowMapper с иерархиями классов

Я хотел знать то, что сообщество рассматривает "лучшими практиками" относительно отображения иерархий классов с Spring JDBC.

У нас нет способности использовать абсолютный инструмент ORM, однако мы используем Spring JDBC для облегчения части утомительной природы JDBC. Одним классом, который мы усиливаем очень регулярно, является BeanPropertyRowMapper, поскольку это - простота использования и способность иметь тип нечувствительный доступ свойства компонента от нашего набора результатов.

У меня есть иерархия классов что все карты назад к единственной таблице (проявляющий table-per-hiearchy подход для этой небольшой иерархии классов). По сути, таблица содержит classId столбец, который может использоваться для определения, какой класс нужно на самом деле инстанцировать.напр. 1 = менеджер, 2 = Сотрудник, 3 = Подрядчик. Все они являются "Людьми", но каждый подкласс человека имеет несколько атрибутов, которые уникальны для их класса.

Моя начальная буква думала, должен создать подкласс BeanPropertyRowMapper и попытаться ввести эту логику для высказывания, "если столбец A = 1 затем инстанцирует менеджера и затем делает привязку nomral".

Это походит на разумный подход? Есть ли какие-либо другие люди предложений, может иметь, которые работали на Вас?

6
задан Cœur 24 November 2019 в 06:38
поделиться

1 ответ

Не похоже, что есть место в подклассе где вы можете добавить ловушку для переключения класса без полного копирования реализации 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;

            }
        }
    };
4
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: