Java / Hibernate: как вставить определенное значение для столбца с автоинкрементом / @GeneratedValue - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть таблица со столбцом идентификатора, которая автоинкрементна, и объект Java, в котором есть получатель, помеченный @GeneratedValue(strategy = GenerationType.AUTO).Это прекрасно работает при сохранении, однако для модульного теста я хочу указать идентификатор, чтобы он был детерминированным.В MySQL (используемая нами БД) я могу указать значение в операторе вставки, и все работает отлично.Однако, если я устанавливаю поле id в объекте java и пытаюсь сохранить его, hibernate выдает исключение.Как я могу позволить Hibernate разрешить мне указывать значение для обычно генерируемого значения?

Пример поля:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return this.id;
}

Работает в MySQL:

INSERT INTO myTable (id, str)
VALUES (10,'this works!')

Неработа:

MyObject myObject = new MyObject();
myObject.setId(10L); //remove this line and hibernate saves ok
myObject.setStr("this does not work.");
daoForMyObject.persist(myObject); //throws org.springframework.dao.DataIntegrityViolationException

Заранее благодарим за помощь в разработке хорошего тест-ориентированного разработчика!

1 Ответ

4 голосов
/ 10 сентября 2011

Извините, что отвечаю так, как вы, вероятно, не хотите, но я думаю, что ваша идея плохая.Если ваша цель - быть хорошим разработчиком, ориентированным на тестирование, не делайте этого.Вы в основном саботируете то, что хотите проверить.Вы запрашиваете специальное поведение от вашего устройства, когда вы тестируетеНо юнит-тест должен проверить юнит как он есть.

Если hibernate позволит вам установить фиксированное значение для поля автоинкремента (или около того), это можно считать ошибкой в ​​hibernate.На мой взгляд, хорошо, что hibernate не позволяет этого.

Почему бы вам не прочитать значение id после вызова метода session.save()?Вероятно, ваши daoForMyObject.persist() звонят save(), поэтому сразу после этого вы можете прочитать идентификатор:

MyObject myObject = new MyObject();
myObject.setStr("this does work.");
daoForMyObject.persist(myObject);
Long id = myObject.getId();

Теперь используйте id для ссылки на вашу сущность вместо 10 ... почему вы не сможетесделать это таким образом?

...