3.1Hibernate-Collection

来源:互联网 发布:linux输入法切换快捷键 编辑:程序博客网 时间:2024/06/11 10:12

1、作用在List上的@OrderColumn和@OrderBy区别

如果想要保持存入顺序与取出顺序,则需要使用。

参考:https://stackoverflow.com/questions/11433195/hibernate-orderby-vs-ordercolumn-to-maintain-the-order-of-a-collection

@OrderBy使用类中的子实体属性作为排序依据。

eg:(摘自Hibernate官方用户手册)

@Entity(name = "Person")public static class Person {    @Id    private Long id;    @OneToMany(cascade = CascadeType.ALL)    @OrderBy("number")    private List<Phone> phones;
 ……//setter、getter方法}@Entity(name = "Phone")public static class Phone {    @Id    private Long id;    private String type;    @Column(name = "number")    private String number;    ……//setter、getter方法}
使用该方法存入3个Phone,并设置到Person中的phones集合。结果如下:


使用@OrderBy时,当从数据库中查询遍历结果,查询语句会自动加上order by asc/desc

即上述案例查询语句会类似select ... order by phone.number ASC

但如果list里顺序改变,读出来的元素顺序也会改变

@OrderColumn会在表中添加一列,包含集合中保存的实体在集合里的索引,即使改变了list集合中元素顺序,Hibernate也会改变索引列的对应元素的索引值,所以读取list中元素出来顺序依旧不变。该索引与添加进list的顺序有关,与persist/save顺序无关。

此处疑点(待解决):不明确改变了list集合中元素顺序的情况是怎样,试过remove后再次添加,两者元素顺序都发生改变。使用@OrderBy@OrderColumn均不受persist顺序影响。

2、Set(如果要保存不重复的数据,需要使用Set集合

(1)HashSet——实体类重写equals和hashCode方法



测试结果:


(2)SortedSet——实现Comparable接口



运行上面代码会出现错误:

原因:需要加上@SortNatural注解

一个依赖于给定子元素的自然排序顺序,并且该子元素实现了Comparable接口逻辑的SortedSet必须使用@SortNatural 注释来注释。


测试结果:

运行两次结果如下:


3、Map

    有些时候,属性的名称可能不确定、经常改变,可以通过Map的key做属性的名称、Map的value作为属性的值。

Map就是【一对多】


测试结果:

 

注解解析:

@MapKey

用于指定Map中的key的关系。当该key为标量类型(直接量)、value为自定义类型或者该key是某个实体类中的属性。

eg1:

     

eg2:

    

      


@MapKeyColumn

指定Map中key的类型

eg:

   

   




原创粉丝点击