[英]Hibernate OneToONe Lazy Fetching
我知道這個問題被問了好幾次,但我找不到關於這個主題的明確例子和答案(我也嘗試了其他可能的解決方案)。
我正在使用Spring JPA
和Hibernate
並嘗試對 OneToONe 關系進行延遲獲取。 我有 2 個簡單的實體類,一個 Repository 類並使用 h2 數據庫來延遲加載實體。 我嘗試構建時間字節碼檢測來實現這一點,這些是我的課程。
A級
@Entity
public class A {
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "a")
@LazyToOne(LazyToOneOption.NO_PROXY)
private B b;
}
B級
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "A_ID")
private A a;
}
存儲庫
public interface ARepository extends JpaRepository<A, Long> {
A findByName(String name);
}
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>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
最后是 h2 數據庫的initdata.sql
insert into a (name, id) values ('a', 1);
insert into b (a_id, id) values (1, 1);
當我在測試類中調用findByName()
方法時,它仍然對A
和B
執行2個查詢。 我怎樣才能懶惰地獲取B
類? 提前致謝。
在本教程中對您的問題有答案
那是因為 Hibernate 需要知道它是否應該使用 null 或代理類初始化手稿屬性。 它只能通過查詢手稿表來找到引用此 Book 實體的記錄。 Hibernate 團隊決定,如果他們無論如何都必須查詢手稿表,最好急切地獲取關聯的實體。
據我所知,避免 2 個查詢是不可能的,因為 Hibernate 需要知道應該在“一對一字段”中插入什么 - 代理或空值。 如果輔助表中有相關記錄,則將代理插入到您的對象中,如果沒有任何記錄,則為 NULL。 所以休眠執行第二個查詢進行檢查。 Insted“一對一”你可以使用“多對一”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.