Конструктор по умолчанию выполнялся много раз при попытке загрузить записи в Hibernate 5.x - PullRequest
0 голосов
/ 01 января 2019

Может кто-нибудь помочь мне понять, почему конструктор по умолчанию выполнялся много раз при попытке загрузить записи в Hibernate 5.x

Класс сохраняемости

public class Customer {

    private int cid;
    private String cphone;
    private String ccity;
    private String cemail;

    public Customer() {
        System.out.println("**Default Constructor**");
    }

    public Customer(String cphone, String ccity, String cemail) {
        this.cphone = cphone;
        this.ccity = ccity;
        this.cemail = cemail;
    }

    public int getCid() {
        return cid;
    }

    public void setCid(int cid) {
        this.cid = cid;
    }

    public String getCphone() {
        return cphone;
    }

    public void setCphone(String cphone) {
        this.cphone = cphone;
    }

    public String getCcity() {
        return ccity;
    }

    public void setCcity(String ccity) {
        this.ccity = ccity;
    }

    public String getCemail() {
        return cemail;
    }

    public void setCemail(String cemail) {
        this.cemail = cemail;
    }
}

Действия по загрузке записей enter image description here

Журналы Console Logs Screenshot

Примечание: Пробовал с SQLServer 2014 и Hibernate 5.3.7

1 Ответ

0 голосов
/ 01 января 2019

Первый вызов

Начиная с 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.Это третий вызов конструктора


Чтобы лучше понять, что происходит, я бы порекомендовал вам отладить его.

Установите точку останова в конструкторе по умолчанию и наблюдайте за трассировкой стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...