Когда JPA устанавливает @GeneratedValue @Id

У меня есть простая сущность JPA, которая использует сгенерированный длинный «ID» в качестве своего первичного ключа:

@Entity
public class Player {
   private long id;

   protected Player() {
     // Do nothing; id defaults to 0L
   }


   @GeneratedValue
   @Id
   public long getId() {
      return id;
   }

   protected void setId(final long id) {
      this.id = id;
   }
   // Other code
}

В какой-то момент жизненного цикла объекта этого типа JPA должен вызвать setId () для записи сгенерированного значения ID. Мой вопрос: , когда это происходит, и где находится документация, которая утверждает это . Я просмотрел спецификацию JPA и не нашел четкого заявления.

Спецификация JPA гласит (курсив добавлен):

Экземпляр управляемого объекта - это экземпляр с постоянным идентификатором , который в настоящее время связан с постоянным контекстом.

Это попытка сказать, что объект должен управляться , чтобы его @Id был значимым? В документации для EntityManager.persist () говорится (выделение добавлено), что он делает «экземпляр управляемым и постоянным», значит ли это, что @Id является установлен этим методом? Или нет, пока вы не вызовете EntityTransaction.commit () ?

Когда установлен @Id , он может отличаться для разных поставщиков JPA и, возможно, для разных стратегий генерации.Но каково самое безопасное (переносимое, соответствующее спецификации) предположение, которое вы можете сделать о самой ранней точке жизненного цикла, которая была установлена?

44
задан Manuel Drieschmanns 7 November 2017 в 13:33
поделиться