Первый вызов
Начиная с Hibernate 5.3.7 первый один происходит во время SessionFactory
процесса инициализации:
if ( identifierGetter != null && constructor != null ) {
// use the id value of a newly instantiated instance as the unsaved-value
final Serializable defaultValue = (Serializable) identifierGetter.get( instantiate( constructor ) );
return new IdentifierValue( defaultValue );
}
Похоже, выясняется, какое значениеполя @Id
указывает, что @Entity
не сохранен.
См. UnsavedValueFactory
.
Второй вызов
Выиспользуя Session#load
, который возвращает прокси для сущности, если он существует.
Прокси-класс является подклассом @Entity
Итак, конструктор прокси-классавызывает супер конструктор.Следовательно, секунда вызов
Третий вызов
Затем вы заставляете Hibernate
инициализировать сущность (вы вызываете getCemail()
).Hibernate
выполняет оператор sql
, а затем инициализирует AbstractLazyInitializer#target
.Это третий вызов конструктора
Чтобы лучше понять, что происходит, я бы порекомендовал вам отладить его.
Установите точку останова в конструкторе по умолчанию и наблюдайте за трассировкой стека.