所以我有以下映射的Comment
實體;如何在訪問唯一標識符時防止延遲初始化?
@Data
@ToString(exclude = {"user", "place"})
@Entity
public class Comment extends AbstractEntity {
@ManyToOne
private User user;
@ManyToOne
private Place place;
@Column(columnDefinition = "TEXT")
private String comment;
@Column
private Integer rating;
@Column
private Boolean approved;
}
我取Comments
這樣
Page<Comment> comments = commentRepository.findByApprovedIsFalseOrApprovedIsNull(pageable);
,並把它變成視圖表這樣
<tr th:each="comment,i : ${comments}">
<td><input name="places" th:value="${comment.id}" type="checkbox"></td>
<td th:text="${comments.number} * ${comments.size} + ${i.count}">LP1</td>
<td th:text="${comment.user.id}">1234</td>
<td th:text="${comment.place.id}">5432</td>
<td th:text="${comment.createdAt}">2014-04-10</td>
<td th:text="${comment.comment}">Lorem ipsum and more</td>
<td>Location</td>
</tr>
現在的問題是,儘管Comment
表(是的,沒有實體)包含列user_id
和place_id
,執行額外的選擇以獲取不同的Place
和User
關係。由於我只訪問這些實體的標識符,實際上它們已經隱藏在Comment
的隱藏之下,爲什麼會發生這種初始化?是否可以省略這些額外的初始化提取?
編輯:
我已經檢查了一些消息來源,我也發現了,那BasicLazyInitializer
必須返回標識僅就像我需要的能力,但我不知道,什麼樣的條件必須在頂層得到滿足得到這個分支appied。看看這裏:
您是否嘗試添加提取和可選屬性,即'@ManyToOne(fetch = FetchType.LAZY,optional = false)'? –
@MadhusudanaReddySunnapu,但默認情況下它們是懶惰的,整個問題表明關係得到了懶惰初始化,這正是我想避免的(因爲它只是因爲id獲取而剩餘) – Antoniossss
您可以按照以下建議映射其他字段或指定連接在您的查詢中進行提取,該查詢應該加載1次中的所有數據並防止用戶和地點的其他查詢。 –