Рубрики
Без рубрики

Плагин для расширения Maven и Gradle Hibernate

Как настроить плагин Maven и Gradle Hibernate Enhance, а также параметры ленивой инициализации, отслеживания ошибок и управления ассоциациями.

Автор оригинала: Vlad Mihalcea.

Вступление

В этой статье я собираюсь объяснить, как настроить плагин Maven и Gradle Hibernate Enhance.

Целью плагина Hibernate Enhance является настройка байт-кода сущности JPA для повышения эффективности и результативности связанных операций доступа к данным.

Плагин для улучшения спящего режима Maven

Для Maven Hibernate предлагает плагин hibernate-enhance-maven , который позволяет включить расширение байт-кода сущности JPA.

Итак, в вашем проекте pom.xml Файл конфигурации Maven, вам нужен следующий плагин:


    org.hibernate.orm.tooling
    hibernate-enhance-maven-plugin
    ${hibernate.version}
    
        
            
                true
                true
                true
                false
            
            
                enhance
            
        
    

Плагин для улучшения гибернации Gradle

Если вы используете Gradle, то в файле конфигурации build.gradle вам необходимо выполнить следующие действия, чтобы включить механизм улучшения байт-кода сущности JPA.

Во-первых, вам нужно добавить hibernate-gradle-плагин зависимость:

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "org.hibernate:hibernate-gradle-plugin:$hibernateVersion"
    }
}

Во-вторых, вам нужно применить hibernate-gradle-плагин , как это:

apply plugin: 'org.hibernate.orm'

Наконец, чтобы настроить выполнение плагина для улучшения байт-кода, вам необходимо добавить следующую конфигурацию:

hibernate {
    enhance {
        enableLazyInitialization = true
        enableDirtyTracking = true
        enableAssociationManagement = true
        enableExtendedEnhancement = false
    }
}

Настройка плагина Maven и Gradle Hibernate Enhance

Как вы уже видели, вы можете настроить четыре свойства:

  • включить Отложенную Инициализацию
  • включить Отслеживание ошибок
  • включить Управление Ассоциациями
  • включить Расширенное Улучшение

По умолчанию для всех этих параметров установлено значение false , поэтому , если вам нужно включить данный параметр улучшения байт-кода, вы должны сделать это явно.

Maven и Gradle Hibernate Расширяют возможности плагина для инициализации

Установив включить ленивую инициализацию в true , Hibernate изменяет байт-код методов getter и setter, чтобы перехватить вызов и инициализировать инициализацию свойства по требованию.

Итак, методы getter и setter Java-компонентов класса сущностей будут изменены с этого:

public PostDetails getDetails() {
    return details;
}

public void setDetails(PostDetails details) {
    this.details = details;
}

к этому:

public PostDetails getDetails() {
    return this.$$_hibernate_read_details();
}

public void setDetails(PostDetails details) {
    this.$$_hibernate_write_details(details);
}

public PostDetails $$_hibernate_read_details() {
    if (this.$$_hibernate_getInterceptor() != null) {
        this.details = (PostDetails) this.$$_hibernate_getInterceptor()
            .readObject(
                this, 
                "details", 
                this.details
            );
    }

    return this.details;
}

public void $$_hibernate_write_details(PostDetails details) {
    if (this.$$_hibernate_getInterceptor() != null) {
        this.details = (PostDetails) this.$$_hibernate_getInterceptor()
            .writeObject(
                this, 
                "details", 
                this.details, 
                details
            );
    } else {
        this.details = (PostDetails) details;
    }
}

Вызываемый метод $$_hibernate_getInterceptor выглядит следующим образом:

public PersistentAttributeInterceptor $$_hibernate_getInterceptor() {
    return this.$$_hibernate_attributeInterceptor;
}

И перехватчик $$_hibernate_attribute объект определяется следующим образом:

@Transient
private transient PersistentAttributeInterceptor $$_hibernate_attributeInterceptor;

Итак, как вы можете видеть, байт-код значительно изменился.

Для получения более подробной информации о параметре включить ленивую инициализацию расширение байт-кода и о том, как его можно использовать для ленивой загрузки атрибута сущности, ознакомьтесь со следующими двумя статьями:

  • Как лениво загружать атрибуты сущностей с помощью.ЛЕНИВЫЙ)
  • Как лениво загружать родительские ассоциации @OneToOne с помощью @LazyToOne(LazyToOneOption.ЛОЖЬ)

Maven и Gradle Hibernate Расширяют возможности плагина для отслеживания

Параметр включить отслеживание загрязнений позволяет записывать, какие свойства изменились, чтобы механизм проверки на наличие загрязнений в режиме гибернации получал список изменений без необходимости проверять каждое свойство с помощью отражения Java.

Как только вы активируете опцию включить отслеживание загрязнений , вы увидите, что настройки JavaBeans свойств сущности изменяются следующим образом:

public void setDetails(PostDetails details) {
    this.$$_hibernate_write_details(details);
}

public void $$_hibernate_write_details(PostDetails details) {
    if (!Objects.deepEquals(details, this.details)) {
        this.$$_hibernate_trackChange("details");
    }

    this.details = details;
}

Метод $$_hibernate_track Изменения выглядит следующим образом:

public void $$_hibernate_trackChange(String property) {
    if (this.$$_hibernate_tracker == null) {
        this.$$_hibernate_tracker = new SimpleFieldTracker();
    }

    this.$$_hibernate_tracker.add(property);
}

Затем Простой трекер полей сохранит свойства сущности, которые были изменены, и предоставит эту информацию механизму проверки на загрязненность при сбросе контекста сохранения.

Maven и Gradle Hibernate Улучшают управление связью с помощью плагинов

Параметр включить управление ассоциациями пытается выполнить требование синхронизации обеих сторон двунаправленной ассоциации .

Таким образом, вместо того, чтобы полагаться на то, что вы предоставите addChild и removeChild методы в родительской сущности, Hibernate изменяет методы настройки:

public void setDetails(PostDetails details) {
    this.$$_hibernate_write_details(details);
}

public void $$_hibernate_write_details(PostDetails details) {
    if (this.details != null && 
        Hibernate.isPropertyInitialized(
            this.details, 
            "post"
        ) && 
        details == null
    ) {
        ((PostDetails)this.details).$$_hibernate_write_post((Post)null);
    }

    this.details = details;
    
    if (details != null && 
        Hibernate.isPropertyInitialized(details, "post") && 
        ((PostDetails)details).$$_hibernate_read_post() != this) {
        ((PostDetails)details).$$_hibernate_write_post(this);
    }
}

включить управление ассоциациями не может перехватывать изменения, происходящие в коллекции дочерних сущностей, и по этой причине вам лучше использовать методы addChild и removeChild .

Maven и Gradle Hibernate Расширяют возможности плагина – Расширенное расширение

Опция включить расширенное улучшение позволяет механизму улучшения байт-кода использовать методы, выходящие за рамки геттера и сеттеров.

Итак, учтите, что у вашей сущности есть следующий служебный метод:

public boolean contains(PostComment comment) {
    return this.comments.contains(comment);
}

Если вы включите опцию включить расширенное улучшение , режим гибернации также может улучшить этот метод:

public boolean contains(PostComment comment) {
    return this.$$_hibernate_read_comments().contains(comment);
}

Это позволит вам инициализировать или отслеживать изменения, происходящие со свойствами сущности, даже за пределами области методов получения или настройки.

Когда дело доходит до геттера и сеттеров, определение метода довольно простое, и результат автоматического инструментирования байт-кода может быть детерминированным. Однако другие методы могут быть более сложными, и если вы включите опцию включить расширенное улучшение , возможно, механизм улучшения байт-кода вносит непреднамеренные изменения, поэтому вам следует быть очень осторожным при включении этой опции.

Вывод

Плагин Maven Gradle Hibernate Enhance позволяет вам настраивать свойства сущности JPA, чтобы вы могли включать отложенную загрузку на уровне свойств, отслеживать изменения или синхронизировать двунаправленные ассоциации.