Как совместить JDBI @GetGeneratedKeys с Mapper
Я хотел бы, чтобы JDBI преобразовал автоматически сгенерированный первичный ключ (Long value) в другой класс.
Мой DAO:
@RegisterMapper(SystemIdMapper.class)
public interface SystemDao {
@SqlUpdate("insert into systems(device_id, user_id) values(:deviceId.value, :userId.value)")
@GetGeneratedKeys
@Mapper(SystemIdMapper.class)
SystemId insert(@BindBean("deviceId") DeviceId deviceId, @BindBean("userId") UserId userId);
}
Мой картограф
public class SystemIdMapper implements ResultSetMapper<SystemId> {
@Override
public SystemId map(int index, ResultSet r, StatementContext ctx) {
return new SystemId(0L); //fake mapping to simplify example
}
}
Когда я запускаю свой код, я получаю NullPointerException в FigureItOutResultSetMapper.map(..), потому что
f = factory.mapperFor(rt, ctx);
установите f в ноль. Так что я думаю, что мой картограф неправильно зарегистрирован.
Кроме использования аннотаций @RegisterMapper и @Mapper(SystemIdMapper.class) я также пробовал:
dbi.registerMapper(new SystemIdMapper());
но все же без удачи.
1 ответ
Решение
Вам нужно указать маппер в аннотации GetGeneratedKeys.
@GetGeneratedKeys(SystemIdMapper.class)
@Mapper или @RegisterMapper не используются для получения идентификатора обратно. Используется только при выборе значений из таблицы.