Hibernate基本映射

本文详细解析了Hibernate映射文件的结构与配置,包括<hibernate-mapping>元素、<class>元素及标识属性的配置,探讨了属性映射、主键生成策略和延迟加载等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射文件的基本结构

在这里插入图片描述

hibernate-mapping元素

位于映射文件顶层的是<hibernate-mapping>元素,该元素定义了XML配置文件的基本属性,即它所定义的属性在映射文件的所有节点中都有效。
在这里插入图片描述

  1. chema
    指定所映射的数据库模式的名称。若指定该属性, 则表名会自动添加该 schema 前缀;Oracle数据库,是指用户名,其他数据库一般需要;
  2. catalog
    指定所映射的数据库catalog的名称。
  3. default-lazy (默认为 true)
    设置延迟加载策略。该属性的默认值为 true, 即启用延迟加载策略; 若配置 Java 属性映射, 集合映射时没有指定 lazy 属性, 则 Hibernate 将采用此处指定的延迟加载策略
  4. auto-import(默认为 true)
    指定是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。为true时表示可以在HQL中只使用类名,为false时表示在HQL必须使用类全路径名。 如果项目中有两个同名的持久化类,则最好在这两个类的对应的映射文件中配置为false
  5. default-cascade (默认为 none)
    设置hibernate默认的级联风格. 若配置 Java 属性, 集合映射时没有指定 cascade 属性, 则 Hibernate 将采用此处指定的级联风格.
  6. default-access(默认为 property):
    指定 Hibernate 的默认的属性访问策略。默认值为 property, 即使用 getter, setter 方法来访问属性. 如果指定access = “field”,则Hibernate会忽略getter/setter方法对,而是通过反射来访问成员变量。如果需要实现自己的属性访问策略,则需要自己提供propertyAccessor借口的实现类,再在access中设置自定义属性访问策略类的名字。
  7. package (可选)
    设置映射文件class中节点默认的包名称,配置了这个属性,那么在class节点中的name属性就只需指定类名就可以了,不用再写类全名

class 元素

在这里插入图片描述
<class>元素用来声明一个持久化类,它是XML配置文件中的主要配置内容。通过它可以定义Java持久化类与数据表之间的映射关系。

  1. name
    指定该持久化类映射的持久化类的类名

  2. table
    指定该持久化类映射的表名 , Hibernate 默认以持久化类的类名作为表名

  3. dynamic-insert
    若设置为 true, hibernate在生成insert语句时,会过滤过值为null的属性。默认值为 false
    在这里插入图片描述

  4. dynamic-update
    若设置为 true, hibernate在生成update语句时,会过滤过值为null的属性。 默认值为 false

  5. select-before-update
    是否在执行update前执行一下select以确定对象真的改变了才执行update。

  6. mutable
    类是否会发生改变,如果类实例对应的数据库表记录不会发生更新,可将其设为false,适用于单纯的Insert操作不使用update操作。

  7. optimistic-lock
    (乐观锁定) (可选,默认是version): 决定乐观锁定的策略。

  8. discriminator-value: 指定区分不同子类的值. 当使用 元素来定义持久化类的继承关系时需要使用该属性; 它可以接受的值包括 null 和 not null

  9. schema:覆盖根元素中指定的schema名字

  10. catalog:覆盖根元素中指定的catalog名字

  11. batch-size: 用于设置批次操作的SQL语句的数量,默认为1。

  12. lazy: 指定是否使用延迟加载.

映射标识属性 id

标识属性映射到持久化类对应的数据表中的主键列。通过配置标识属性,Hibernate就可以知道数据表产生主键的首选策略。
在这里插入图片描述

  1. column
    设置标识属性所映射的数据表的列名(主键字段的名字).

  2. unsaved-value=“null|any|none|undefined|id_value”: 若设定了该属性, Hibernate 会通过比较持久化类的 OID 值和该属性值来区分当前持久化类的对象是否为临时对象(一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。)

  3. type
    数据库字段的Hibernate 映射类型。Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁. 如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类型

    Java 的基本数据类型和包装类型对应相同的 Hibernate 映射类型. 基本数据类型无法表达 null, 所以对于持久化类的 OID 推荐使用包装类型

  4. name
    用来指定,数据库中的主键字段由对象中的哪个属性来确定

 主键生成策略generator

  1. increment 由hibernate以递增的方式为代理主键赋值
    原理:先读取表中的主键的最大值,而接下来向表中插入记录时,就在max(id)基础上递增,增量为1
    注意:适用于单各Hibernate进程访问同一个数据库的场合,不适合集群环境
    OID类型必须为long、int或short类型
  2. identity 由底层数据库生成标识符,前提条件是底层数据库支持自动增长的字段类型
    例如:oracle无法使用
    OID类型必须为long、int或short类型
  3. sequence Hibernate根据底层数据库的序列来生成标识符,前提条件是底层数据库支持序列,例如DB2、Oracle等。OID必须是long、int、short类型。
  4. hilo 使用一个高/低位算法来高效的生成int类型的标识符。**需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。 可以跨数据库。**给定一个表和字段(默认分别是是hibernate_unique_key 和next_hi)作为高位值得来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在用户自行提供的连接中,不要使用这种生成器。
  5. native
    根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

以下总结了几种常用数据库系统可用的标识符生成器:

MySQL:increment、identity、hilo、native
MS SQL Server:increment、identity、hilo、native
Oracle:sequence、seqhilo、hilo、increment、native
跨平台开发:native

基本类型-property

property 元素用于指定类的属性和表的字段的映射。
在这里插入图片描述

  1. name:指定该持久化类的属性的名字
  2. column:指定与类的属性映射的表的字段名. 如果没有设置该属性, Hibernate 将直接使用类的属性名作为字段名.
  3. type:指定 Hibernate 映射类型. Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁. 如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类型.
  4. not-null:若该属性值为 true, 表明不允许为 null, 默认为 false
  5. access:指定 Hibernate 的默认的属性访问策略。默认值为 property, 即使用 getter, setter 方法来访问属性. 若指定 field, 则 Hibernate 会忽略 getter/setter 方法, 而通过反射访问成员变量
  6. unique: 设置是否为该属性所映射的数据列添加唯一约束
  7. index: 指定一个字符串的索引名称. 当系统需要 Hibernate 自动建表时, 用于为该属性所映射的数据列创建索引, 从而加快该数据列的查询.
  8. length: 指定该属性所映射数据列的字段的长度
  9. scale: 指定该属性所映射数据列的小数位数, 对 double, float, decimal 等类型的数据列有效.
  10. formula公式:设置一个 SQL 表达式, Hibernate 将根据它来计算出派生属性的值. 【formula】
    派生属性: 并不是持久化类的所有属性都直接和表的字段匹配, 持久化类的有些属性的值必须在运行时通过计算才能得出来, 这种属性称为派生属性
    formula属性是个特别强大的的特征。用一个SQL表达式生成计算的结果,它会在这个实例转载时翻译成一个SQL查询的SELECT子查询语句。如:<property name="totalPrice" formula="(SELECT SUM(*) FROM user)" />
    利用formula的强大特征,可以实现持久化类某个属性的生成,而该属性不会保存,不会有对应的数据列(即数据库无此列数据,只包含在实体类里)
    使用 formula 属性时
    ⌂ formula=“(sql)” 的英文括号不能少
    ⌂ Sql 表达式中的列名和表名都应该和数据库对应, 而不是和持久化对象的属性对应
    ⌂ 如果需要在 formula 属性中使用参数, 这直接使用 where cur.id=id 形式, 其中 id 就是参数, 和当前持久化对象的 id 属性对应的列的 id 值将作为参数传入.
    在这里插入图片描述
    以下情况下必须显式指定 Hibernate 映射类型
    一个 Java 类型可能对应多个 Hibernate 映射类型. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hibernate 映射类型可以是 date, time 或 timestamp. 此时必须根据对应的数据表的字段的 SQL 类型, 来确定 Hibernate 映射类型. 如果字段为 DATE 类型, 那么 Hibernate 映射类型为 date; 如果字段为 TIME 类型, 那么 Hibernate 映射类型为 time; 如果字段为 TIMESTATMP 类型, 那么 Hibernate 映射类型为 timestamp.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值