JPA / Hibernate / MS SQL Server не возвращает сгенерированное значение идентификатора - PullRequest
4 голосов
/ 17 августа 2010

Я использую диспетчер объектов Hibernate 3.5.1-Final с MS SQL Server 2005 и пытаюсь сохранить несколько новых объектов.Моя сущность настроена аннотациями следующим образом:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

После вызова

entityManager.persist(newEntity)

Я не вижу сгенерированного набора ID, он остается равным 0. Это вызывает следующее исключение при сохранении следующего новогоentity:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [x.y.z.MyEntity#0]

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

Ответы [ 3 ]

2 голосов
/ 14 августа 2014

У меня была похожая проблема, которую я устранял, и это работало для меня:

em.persist({ENTITY_TO_PERSIST});
em.flush();
em.refresh({ENTITY_TO_PERSIST});

Метод refresh () добился цели.

ПРИМЕЧАНИЕ. В своем ответе я предположил, что ваша таблица базы данных правильно настроена с установленной для нее характеристикой идентификации «да» для рассматриваемого столбца.

0 голосов
/ 18 августа 2010

Я не вижу сгенерированного идентификатора, он остается равным 0.

Сам аннотированный код выглядит правильно (вы можете использовать IDENTITY с типами long, short, integer - и соответствующими им типами оболочки - и String). Теперь вопросы:

  • действительно ли вы используете столбец идентификаторов на стороне базы данных (пожалуйста, покажите определение таблицы)?
  • какой оператор SQL действительно выполняется (активировать ведение журнала SQL)?
  • что произойдет, если вы выполните сгенерированный SQL в клиенте SQL?

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

Это явно не решение. Сгенерированный идентификатор должен быть назначен постоянному объекту, и любое другое поведение является неожиданным. Определенно, есть несоответствие, которое необходимо исправить. Пожалуйста, предоставьте запрашиваемую информацию.

0 голосов
/ 17 августа 2010

Используйте заглавную букву "I".

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
...