【问题标题】:Which implementation class of set is used by JPAJPA 使用 set 的哪个实现类
【发布时间】:2012-04-27 06:02:59
【问题描述】:

我正在使用休眠。

我有一对多的关系。

@OneToMany(mappedBy = "enrollmentSetupCategory", fetch = FetchType.EAGER, cascade = CascadeType.ALL )
    private Set<EnrollmentSetupCategoryLevel> enrollmentSetupCategoryLevels;

我的问题是我在这里内部使用了哪个 set 实现?如果我扩展可比较的接口,返回的对象是否会被排序? 还是我必须自己排序?

【问题讨论】:

    标签: java hibernate jpa collections


    【解决方案1】:

    Hibernate 支持排序的集合映射,你可以指定你的比较器为你做排序。

    来自docs

    Hibernate 支持实现 java.util.SortedMap 和 java.util.SortedSet。您必须在映射中指定一个比较器 文件:

    <set name="aliases" 
                table="person_aliases" 
                sort="natural">
        <key column="person"/>
        <element column="name" type="string"/>
    </set>
    
    <map name="holidays" sort="my.custom.HolidayComparator">
        <key column="year_id"/>
        <map-key column="hol_name" type="string"/>
        <element column="hol_date" type="date"/>
    </map>
    

    排序属性的允许值是未排序的、自然的和 实现 java.util.Comparator 的类的名称。

    排序后的集合实际上表现得像 java.util.TreeSetjava.util.TreeMap.

    Edit Annotation From Docs,检查

    3.4.6。集合相关注解

     @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
    

    【讨论】:

    • 感谢您的回复。这就像我告诉 hibernate 看看这个你必须用于排序的比较器。一个疑问,如果我让我的班级具有可比性,它内部是否理解我是可比较的班级,我必须按指定的顺序进行排序?
    • 如果您查看休眠文档,Comparable 不是一个选项,docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/…
    • 在这种情况下访问第一个或最后一个元素的最佳方法是什么?我仍然将属性定义为 Set,我是否仍应将其推送到新的 TreeSet(myOriginalSet) 以便轻松访问?在这种情况下,我没有任何好处,因为我使用自然顺序,并且在创建新的 TreeSet 之后它无论如何都是排序的。
    【解决方案2】:

    您将使用 Hibernate 自己的 Set 实现 - org.hibernate.collection.PersistentSet http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/collection/PersistentSet.html 这个类没有实现Comparable接口,所以你应该自己排序或者将它转换为set的一些可排序实现(例如TreeSet)。

    【讨论】:

    • 将 PersistentSet 转换为 TreeSet 会抛出 ClassCastException
    • 我只是想知道为什么在访问集合中的最新元素(我认为它是 TreeSet)时,我在测试中没有得到确定的结果。原来是PersistentSet,当然不关心顺序。感谢您在这里的解释。
    猜你喜欢
    • 2015-11-25
    • 2019-06-20
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2021-08-23
    • 2011-04-19
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多