Как получить идентификатор последней сохраненной сущности, используя JPA - PullRequest
27 голосов
/ 10 марта 2012

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

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

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

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

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

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

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

1 Ответ

53 голосов
/ 10 марта 2012

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

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