使用Hibernate的主键生成策略
JPA标准注解只支持AUTO、IDENTITY、SEQUENCE、TABLE。Hibernate支持更多的主键生成策略。使用@GenericGenerator注解,定义生成主键生成器
@GenericGenerator,属性:
name:设置主键生成器的名称,名称被@GeneratedValue的generator属性引用
strategy:设置该主键生成器的主键生成策略
strategy属性指定如下常用的主键生成策略:
1、increment:为long、shor或int类型主键生成唯一标识
2、identity:返回标识属性long、shor或int
3、sequence:(Oracle、DB2)提供Sequence支持的数据表中适用。返回标识属性是long、short或int类型
4、hilo:使用一个高/低位算法高效地生成long、short或int类型的标识符
5、seqhilo:使用一个高/低位算法高效地生成long、short或int类型的标识符。主键历史状态保存在Sequence中
6、uuid:用一个128位的UUID算法生成字符串类型的标识符
7、guid:在SQL Server和MySQL中使用数据库生成的GUID字符串
8、native:根据底层数据库能力选择identity、sequence或hilo中一个
9、assigned:让应用程序在save()之前为对象分配一个标识符
10、select:通过数据库触发器选择某个唯一主键的行,并返回其1主键值作为表示属性值
11、foreign:直接使用另一个关联对象的表示属性值。
映射集合属性
Hibernate使用集合接口来声明集合属性,因为 当程序持久化某个实例时,Hibernate会自动把程序中的集合实现类替换成Hibernate自己的集合实现类
Hibernate自己的集合类也实现了Map、Set等接口
两个持久化对象不能共同享有一个集合元素的引用
映射集合步骤:
1、集合属性,统一使用 @ElementCollection注解进行映射
属性:
fetch:指定该实体对集合属性的抓取策略。默认FetchType.LAZY(延迟抓取)
targetClass:指定集合属性中 集合元素的类型
2、集合属性需要保存到另一个数据表中,保存集合属性的数据表 必须包含一个外键列,用于参照到主键列,外键列使用@JoinColumn进行映射,
保存集合属性的表,@CollectionTable
@CollectionTable属性:
name:指定保存集合属性的数据表的表名
joinColumns:属性值为@JoinColumn数组,每个@JoinColumn映射一个外键列
@JoinColumn属性:
name:定义外键列的列名
nullable:指定该列是否允许为null,默认true
table:指定该列所在数据表的表名
…
3、考虑集合元素的类型:
(1)集合元素是基本类型及其包装类、字符串类、日期类等,使用@ELementCollection映射集合属性,并使用@Column映射集合元素所对应的列
(2)集合元素是组件:用@ElementCollection集合映射属性,然后使用@Embeddable修饰非持久化实体的复合类
(3)集合元素是关联的持久化实体,使用@OneToMany或@ManyTOMany进行关联映射
4、如果要映射带有索引(List、数组、Map),就需要为集合元素所在的数据表指定一个索引列:
@OrderColumn:用于定义List、数组的索引列
@MapKeyColumn:用于映射Map集合的索引列
例:
@ElementCollection(targetClass=String.class)//集合属性
//映射保存集合属性的表
@CollectionTable(name="school_inf",
joinColumns=@JoinColumn(name="person_id",nullable=false))
//指定保存集合元素的列为school_name
@Column(name="school_name")
//映射集合元素索引的列
@OrderColumn(name="list_order")
private List<String>schools=new ArrayList<>();
注意:映射Set集合属性时,如果@Column注解指定了nullable=false属性,则集合属性表以关联持久化类的外键列和元素列作为联合主键,否则该表没有主键。
集合为Map时,需要通过@MapKeyClass指定Map key类型
//集合属性
@ElementCollection(targetClass=Float.class)
//映射保存集合属性的表
@CollectionTable(name="score_inf",
joinColumns=@JoinColumn(name="person_id",nullable=false))
@MapKeyColumn(name="subject_name")
@MapKeyClass(String.class)
@Column(name="mark")
private Map<String, Float>scores=new HashMap<>();
有序集合的映射(SortedSet和SortedMap)
映射有序集合时,只能使用Hibernate本身提供的@SortNatural(自然排序)、
@SortComparator注解:定制排序,必须指定value属性,属性值为Comparator实现类
SortedSet:
@ElementCollection(targetClass=String.class)
@CollectionTable(name="training_inf",
joinColumns=@JoinColumn(name="person_id",nullable=false))
@Column(name="training_name",nullable=false)
@SortNatural
private SortedSet<String>trainings=new TreeSet<>();
如果希望数据库查询自己对集合元素排序,则可使用@OrderBy注解
@OrderBy("training_name desc")
Hibernate主键生成与集合映射详解
本文详细介绍了Hibernate的主键生成策略,包括increment、identity、sequence、hilo等,并探讨了如何使用@GenericGenerator注解进行自定义设置。此外,还详细讲解了Hibernate映射集合属性的方法,包括@ElementCollection、@CollectionTable和@JoinColumn的使用,以及如何处理不同类型的集合元素。最后,讨论了有序集合SortedSet和SortedMap的映射,包括自然排序和自定义排序策略。
1万+

被折叠的 条评论
为什么被折叠?



