簡體   English   中英

JPA Hibernate意外地獲取@OneToOne映射實體的記錄,我應該將映射更改為@ManyToOne還是做其他事情?

[英]JPA Hibernate unexpectedly fetches records of @OneToOne mapped entity, should I change mapping to @ManyToOne or do something else?

我有一個具有@OneToOne映射子實體的實體:

@Entity @Table
public class BaseEntity {

    @Id
    private String key;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private InnerEntity inner;

}

@Entity @Table
public class InnerEntity {

    private String data;
}

在堅持和合並操作上,它一直工作得很好,直到我決定在命名查詢( SELECT e FROM BaseEntity e )中獲取所有記錄。 問題在於,調用它之后,Hibernate從BaseEntity獲取所有記錄,然后對每個InnerEntity執行不同的查詢。 因為表很大,所以要花很多時間和內存。

首先,我開始研究getInner()是否在運行代碼的任何地方被調用。 然后,我嘗試將fetchType更改為EAGER以檢查Hibernate是否要通過一個查詢來全部獲取。 沒有。 另一種嘗試是將映射更改為@ManyToOne 為此,我向@JoinColumn注解添加了@JoinColumn updatable/insertable=false 提取開始完全正常-一個沒有任何JOIN SELECT (我將EAGER更改回LAZY ),但是更新開始出現問題。 Hibernate期望InnerEntity首先被持久化,但是沒有具有主鍵的屬性。 當然我可以做到這一點,並且首先明確地堅持InnerEntity調用setKey() ,但是我寧願不這樣做就解決它。

有任何想法嗎?

如果您希望按需加載inner字段,並且您的關系為@OnToOne ,則可以嘗試此操作

@OneToOne(fetch = FetchType.LAZY, optional = false)

使用HQL時,休眠不考慮注釋,因此您應該告訴它如何工作。 在您的情況下,您應該像這樣對HQL進行權衡:從左選擇SELECT e FROM BaseEntity並加入e.inner

暫無
暫無

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

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