当前位置: 首页 > 面试题库 >

Hibernate CollectionOfElements EAGER提取重复元素

钱繁
2023-03-14
问题内容

我有一个名为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中,从而确保它们是唯一的。



 类似资料:
  • 我正在尝试编写一个方法union(),它将返回一个int数组,它需要两个int数组参数,并检查它们是否为集合,或者换句话说,它们之间是否存在重复项。我编写了另一个方法isSet(),它接受一个数组参数并检查数组是否为集合。问题是我想检查union方法中的两个数组之间是否有重复项,如果有,我想提取其中一个重复项并将其放入unionArray[]int数组中。这就是我到目前为止所尝试的。 我想做的是使

  • 我有两份清单: 我想为每个元素创建一个索引列表列表,如下所示: 我试过这个: 但我得到了这些不同的结果:

  • 这是我想得到的所有“总流量”输出的url 如何使用 JSON 获取此输出?

  • 我在iOS 7上运行良好的应用程序与iOS 8 SDK不兼容。 CLLocationManager不返回位置,并且我在

  • 我试图从字典中提取第一个元素,如下所示: 输出: 我尝试了,但它只提取第一项。我需要完整的列表,因为我想用这个列表构建一个新的熊猫数据框架。 期望输出:

  • 我正在寻找提取表中的数据,我已经找到做以下工作: 从我得到的球员 现在我想检索表中的数据。我该怎么做? 编辑:我应该说,当我这样做的时候 我得到