簡體   English   中英

休眠 OneToONe 延遲獲取

[英]Hibernate OneToONe Lazy Fetching

我知道這個問題被問了好幾次,但我找不到關於這個主題的明確例子和答案(我也嘗試了其他可能的解決方案)。

我正在使用Spring JPAHibernate並嘗試對 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()方法時,它仍然對AB執行2個查詢。 我怎樣才能懶惰地獲取B類? 提前致謝。

教程中對您的問題有答案

那是因為 Hibernate 需要知道它是否應該使用 null 或代理類初始化手稿屬性。 它只能通過查詢手稿表來找到引用此 Book 實體的記錄。 Hibernate 團隊決定,如果他們無論如何都必須查詢手稿表,最好急切地獲取關聯的實體。

據我所知,避免 2 個查詢是不可能的,因為 Hibernate 需要知道應該在“一對一字段”中插入什么 - 代理或空值。 如果輔助表中有相關​​記錄,則將代理插入到您的對象中,如果沒有任何記錄,則為 NULL。 所以休眠執行第二個查詢進行檢查。 Insted“一對一”你可以使用“多對一”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM