Hibernate映射(二)

Hibernate主键生成与集合映射详解
本文详细介绍了Hibernate的主键生成策略,包括increment、identity、sequence、hilo等,并探讨了如何使用@GenericGenerator注解进行自定义设置。此外,还详细讲解了Hibernate映射集合属性的方法,包括@ElementCollection、@CollectionTable和@JoinColumn的使用,以及如何处理不同类型的集合元素。最后,讨论了有序集合SortedSet和SortedMap的映射,包括自然排序和自定义排序策略。

使用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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值