我有一个名为SynonymMapping的类,该类具有映射为CollectionOfElements的值的集合
@Entity(name = "synonymmapping")
public class SynonymMapping {
@Id private String keyId;
//@CollectionOfElements(fetch = FetchType.EAGER)
@CollectionOfElements
@JoinTable(name="synonymmappingvalues", joinColumns={@JoinColumn(name="keyId")})
@Column(name="value", nullable=false)
@Sort(type=SortType.NATURAL)
private SortedSet<String> values;
public SynonymMapping() {
values = new TreeSet<String>();
}
public SynonymMapping(String key, SortedSet<String> values) {
this();
this.keyId = key;
this.values = values;
}
public String getKeyId() {
return keyId;
}
public Set<String> getValues() {
return values;
}
}
我有一个测试,其中将两个SynonymMapping对象存储到数据库,然后要求数据库返回所有已保存的SynonymMapping对象,期望接收到我存储的两个对象。
当我将值的映射更改为热切时(如代码中注释行所示)并再次运行测试,我收到了四个匹配项。
我已经清除了两次运行之间的数据库,并且可以复制在急切和懒惰之间交换此问题的方法。
我认为这与 hibernate 在下面创建的联接有关,但是我无法在网上找到明确的答案。
谁能告诉我为什么急切地提取对象?
谢谢。
最佳答案
在映射中强制执行紧急获取通常不是一个好主意-最好在适当的查询中指定紧急连接(除非您100%确定在任何情况下您的对象在没有该集合的情况下都不会有意义/有效)正在填充)。
之所以会得到重复,是因为Hibernate在内部连接了根表和集合表。请注意,它们实际上是重复的,例如对于2个每个具有3个集合元素的SynonymMappings,您将获得6个结果(2x3),每个SynonymMapping实体3个副本。因此,最简单的解决方法是将结果包装在Set中,从而确保它们是唯一的。