![](/img/trans.png)
[英]JPA OneToMany and ManyToOne throw: Repeated column in mapping for entity column (should be mapped with insert=“false” update=“false”)
[英]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.