1、作用在List上的@OrderColumn和@OrderBy区别
如果想要保持存入顺序与取出顺序,则需要使用。
参考:https://stackoverflow.com/questions/11433195/hibernate-orderby-vs-ordercolumn-to-maintain-the-order-of-a-collection
@OrderBy使用类中的子实体属性作为排序依据。
eg:(摘自Hibernate官方用户手册)
使用该方法存入3个Phone,并设置到Person中的phones集合。结果如下:@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方法 }
使用@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: