Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA-SortedSet需要订购人_Java_Hibernate_Jpa_Collections - Fatal编程技术网

Java JPA-SortedSet需要订购人

Java JPA-SortedSet需要订购人,java,hibernate,jpa,collections,Java,Hibernate,Jpa,Collections,为什么SortedSet关系需要像hibernate-specific@SortNatural或@OrderBy这样的排序注释 如果在默认情况下使用自然排序,可能会很好。如JPA-2.2()第2.2章所定义: 集合值持久化字段和属性必须根据以下集合值接口之一定义,而不管实体类是否遵守上述JavaBeans方法约定,也不管是否使用字段或属性访问:java.util.Collection,java.util.Set,java.util.List,java.util.Map。应用程序可以使用集合实现类

为什么
SortedSet
关系需要像hibernate-specific
@SortNatural
@OrderBy
这样的排序注释


如果在默认情况下使用自然排序,可能会很好。

如JPA-2.2()第2.2章所定义:

集合值持久化字段和属性必须根据以下集合值接口之一定义,而不管实体类是否遵守上述JavaBeans方法约定,也不管是否使用字段或属性访问:java.util.Collectionjava.util.Setjava.util.Listjava.util.Map。应用程序可以使用集合实现类型在实体持久化之前初始化字段或属性。一旦实体被管理(或分离),后续访问必须通过接口类型进行

然后,当将数据检索到@OneToMany映射字段时,持久性提供程序实现可以为给定字段使用任何相应的实现类。因此,如果映射实体定义了@OneToMany列表,持久性提供程序可以为字段分配ArrayList或列表的任何其他具体实现,无论是否有序。对于未提到的接口,持久性提供者可能接受映射,但不需要尊重它,并且对所使用的实现没有保证

@SortNatural专有注释指示Hibernate使用集合类型的有序实现,该实现将使用实体的“自然比较器”对元素进行排序。如果包含的实体类型实现了Comparable接口,则该comparator将是对给定集合排序的“自然”比较方法

请注意,某些持久性提供程序实现可能会也可能不会重用实例化的字段来填充集合,因此,如果您使用列表或集合的给定有序实现声明并实例化了字段,则尽管没有使用特定于hibernate的注释,但该字段可能已经排序

另一方面,@OrderBy注释与提供者无关,它定义了检索列表或集合上必须遵守的顺序,但它的实现受到数据库对字段排序方式的限制。检索到的集合可以使用保留数据来自数据库的顺序的任何实现,但不能像@SortNatural那样在检索后使用可比接口对数据重新排序


这两种方法都有其优点和缺点,因此您必须验证您的用例,并确定这种排序对于将其释放到数据层是否至关重要。

您所说的自然排序是什么意思?元素类型的
Comparable.compareTo()
契约。
因此,如果映射实体定义了@OneToMany列表,持久性提供程序可以为字段分配一个ArrayList或list的任何其他具体实现
,因此当它看到
SortedSet
并使用扩展本合同的任何实现时,为什么不这样做。我在hibernate中看到了类似于
PersistentSortedSet
的东西,澄清了我对您的建议的回答。我在这里补充说,尽管持久性提供者可能有特定的实现,但它不应该向API的用户公开它。谢谢。因此,我假设这个注释
@SortNatural
Set
SortedSet
给出了相同的结果?是的,它们的工作原理应该是相同的,但是使用Set,您将不会有SortedSet实用程序方法(第一、最后、耳机、尾套、子集)。如果hibernate尊重SortedSet接口(我不确定),并且您没有关于未来中断更改或严格遵守JPA的问题,那么您可以将SortedSet与SortNatural注释结合使用。