所以我有以下映射的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次中的所有数据并防止用户和地点的其他查询。 –