Моя цель - включить отложенную загрузку для двунаправленной ассоциации on-to-one на родительской стороне ассоциации. Рассмотрим следующие два объекта:
Родительский Vendor.java
:
@Entity
@Audited
@NoArgsConstructor
@Getter
public class Vendor extends User {
@JoinColumn(nullable = false, unique = true, updatable = false)
@LazyToOne(LazyToOneOption.NO_PROXY)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "vendor", optional = false, orphanRemoval = true)
private Operator operator;
}
Дочерний Operator.java
:
@Entity
@Audited
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Operator {
@Id
private Long id;
@JoinColumn(name = "id")
@MapsId
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Vendor vendor;
}
Примечание: Я опущендругие поля, конструкторы и функции equals / hashCode для краткости.
Как упоминалось ранее, моя цель - лениво загружать оператор поставщика. Поэтому, следуя руководству пользователя Hibernate и Влада Михальчи о том, как включить улучшение байт-кода в Hibernate , я аннотировал родительскую связь с @LazyToOne(LazyToOneOption.NO_PROXY)
в дополнение к @OneToOne
с помощьюfetch = FetchType.LAZY
. После добавления следующего плагина в мой pom.xml
оператор все еще загружается с нетерпением после извлечения поставщика.
Конфигурация плагина:
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<failOnError>true</failOnError>
<enableLazyInitialization>true</enableLazyInitialization>
<enableDirtyTracking>true</enableDirtyTracking>
<enableAssociationManagement>true</enableAssociationManagement>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
Когда я выбираю поставщика, следующий SQLгенерируется:
2019-10-18 13:43:16.138 INFO 12212 --- [ main] n.t.d.l.l.SLF4JQueryLoggingListener :
Name:dataSource, Connection:8, Time:2, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["select vendor0_.id as id1_39_0_, vendor0_1_.created_at as created_2_39_0_, vendor0_1_.version as version3_39_0_, vendor0_1_.account_non_locked as account_4_39_0_, vendor0_1_.email as email5_39_0_, vendor0_1_.email_verified as email_ve6_39_0_, vendor0_1_.enabled as enabled7_39_0_, vendor0_1_.last_password_reset_date as last_pas8_39_0_, vendor0_1_.password as password9_39_0_, vendor0_.address_district as address_1_43_0_, vendor0_.address_latitude as address_2_43_0_, vendor0_.address_longitude as address_3_43_0_, vendor0_.address_city as address_4_43_0_, vendor0_.address_country_code as address_5_43_0_, vendor0_.address_street as address_6_43_0_, vendor0_.address_street_no as address_7_43_0_, vendor0_.address_zip_code as address_8_43_0_, vendor0_.contact_details_email as contact_9_43_0_, vendor0_.contact_details_phone as contact10_43_0_, vendor0_.customer_no_customer_no as custome17_43_0_, vendor0_.description as descrip11_43_0_, vendor0_.hidden as hidden12_43_0_, vendor0_.name as name13_43_0_, vendor0_.slug as slug14_43_0_, vendor0_.verified as verifie15_43_0_ from vendor vendor0_ inner join users vendor0_1_ on vendor0_.id=vendor0_1_.id where vendor0_.id=?"]
Params:[(4)]
2019-10-18 13:43:16.141 INFO 12212 --- [ main] n.t.d.l.l.SLF4JQueryLoggingListener :
Name:dataSource, Connection:8, Time:1, Success:True
Type:Prepared, Batch:False, QuerySize:1, BatchSize:0
Query:["select operator0_.id as id1_17_0_, operator0_.address_city as address_2_17_0_, operator0_.address_country_code as address_3_17_0_, operator0_.address_street as address_4_17_0_, operator0_.address_street_no as address_5_17_0_, operator0_.address_zip_code as address_6_17_0_, operator0_.bank_account_bic as bank_acc7_17_0_, operator0_.bank_account_iban as bank_acc8_17_0_, operator0_.bank_account_owner as bank_acc9_17_0_, operator0_.company as company10_17_0_, operator0_.contact_details_email as contact11_17_0_, operator0_.contact_details_phone as contact12_17_0_, operator0_.contact_person_first_name as contact13_17_0_, operator0_.contact_person_gender as contact14_17_0_, operator0_.contact_person_last_name as contact15_17_0_, operator0_.tax_id as tax_id16_17_0_, operator0_.vat_id as vat_id17_17_0_ from operator operator0_ where operator0_.id=?"]
Params:[(4)]
Когда я закомментирую поле оператора в Vendor.java
, генерируется только первое утверждение. Я также попытался установить свойство spring.jpa.properties.hibernate.ejb.use_class_enhancer
, как предложено в этом ответе , но оно не изменило сгенерированный SQL. Я опасаюсь, что эта проблема может быть связана с отображением с @MapsId
в Operator.java
, поскольку это не используется в примере Hibernate .
Версия используемых сред:
Пружинный ботинок 2.1.9.RELEASE
Hibernate 5.3.12.Final