Возврат первичного ключа при вставке не работает myBatis-Spring

У меня есть следующая таблица и последовательность

CREATE TABLE teacher
(
  teacher_id serial NOT NULL,
  teacher_name character varying(50),
  CONSTRAINT teacher_pkey PRIMARY KEY (teacher_id)
)


CREATE SEQUENCE teacher_teacher_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

и хочу получить первичный ключ всякий раз, когда я вставляю новую запись. Когда я запускаю следующий запрос, он работает и возвращает нужный мне первичный ключ.

INSERT INTO teacher( teacher_name ) VALUES ('John') RETURNING teacher_id;

Но когда я использую myBatis-Spring Mapper следующим образом

@Insert("INSERT INTO teacher( teacher_name ) " +
        "VALUES ( #{teacherName} ) RETURNING teacher_id" )
public int insertTeacher(Teacher teacher);    

и вызовите функцию с действительным объектом teacher, она вставит значение, но вернет -1.

И я также пробовал следующие

@Insert("INSERT INTO teacher( teacher_id, teacher_name ) " +
            "VALUES ( #{teacherId}, #{teacherName} )" )
@SelectKey(statement="SELECT nextval('teacher_teacher_id_seq');", keyProperty="teacherId", before=true, resultType=int.class)
public int insertTeacher(Teacher teacher);

это возвращает 1 независимо от того, сколько раз я звоню

Может ли кто-нибудь сказать мне причину и дать мне решение? Заранее спасибо.


person Khaino    schedule 14.10.2015    source источник
comment
показать код внутри insertTeacher   -  person Vivek S.    schedule 14.10.2015
comment
@wingᴇdpᴀnᴛʜᴇʀ Внутри insertTeacher нет кода, я использую фреймворк myBatis-Spring, где нам просто нужно объявить функцию вместе с sql, как указано выше, в интерфейсе (Mapper).   -  person Khaino    schedule 14.10.2015


Ответы (1)


После долгих поисков, в отличие от решения, приведенного в этом ссылка, которая может работать для более старых версий или iBatis (но это не работает с последней версией), я обнаружил, что myBatis 3.xx просто не поддерживает возврат автоматического генерирования идентификатора/ключа при вставке. Вместо этого он возвращает обновленную числовую строку, поэтому в моем случае она возвращает 1. Вы можете прочитать больше об этом ссылка.

person Khaino    schedule 19.10.2015