Как получить идентификатор последнего сохраняемого объекта с использованием JPA

Я ищу умный и легко читаемый способ получить идентификатор сохраняемого объекта, используя JPA. Идентификатор является Integer.

Можно подумать о следующих решениях:

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

См. ниже решение 2

MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
System.out.println(en.getId());

Отправляет нулевой идентификатор!

Любые предложения? Я использую MySql, EclipseLink, но нуждаюсь в переносном решении.

Ответ 1

persist не гарантирует получение идентификатора. Идентификатор гарантированно генерируется только во время промывки. Поэтому, если вам действительно нужен идентификатор до завершения транзакции (и диспетчер сущности, таким образом, покраснел), вызовите flush() явно, чтобы получить идентификатор:

MyEntity en = new MyEntity();
en.setName("My name");
em.persist(en);
em.flush();
System.out.println(en.getId());

Ответ 2

Флеш(), похоже, не работает, если я удалю объект и снова сохраню его в базе данных с автоматическим приращением. Идентификатор в базе данных будет увеличен, если активируется автоматическое увеличение. Однако полученный идентификатор после flush() по-прежнему является старым идентификатором.