(三)Hibernate对象-关系映射文件
一、Hibernate中持久化类编写规范
1 2 3 4 5 6 7 8 9 10 | -必须提供无参数的默认构造方法。因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例。 -所有属性必须提供 public 访问控制符的set get方法 -属性应尽量使用基本数据类型的包装类型(如Integer) 基本数据类型无法表达 null 值,所有基本数据类型的默认值都不是 null ,这样就有很大的缺陷。 例如有一个score属性,表示学生分数,如果为 0 ,那么是表示该学生未参加考试还是说该学生成绩为 0 呢? 这时候如果用包装类型,就可以使用 null 来表示空值,学生未参加考试等等。 -不要用 final 修饰实体(将无法生成代理对象进行优化 |
二、对象标识符
1 2 3 4 5 6 7 8 9 10 | 在关系数据库中,通过主键来识别记录并保证记录的唯一性。 主键的要求:不允许为 null ,不能重复,不能改变 自然主键:在业务中,某个属性符合主键的三个要求,那么该属性可以作为主键。比如人的身份证就可以当作主键 代理主键:增加一个不具备任何意义的字段,通常为ID,来作为主键 在java中,按照内存地址不同区分不同的对象。 在Hibernate中通过对象标识符(OID)来维持java对象和数据库表中对应的记录。 与表的代理主键对应,OID也是整数类型,为了保证OID的唯一性和不可变性,通常由Hibernate或者底层数据库库给OID赋值。 |
三、对象-关系映射文件
Hiernate采用XML格式的文件来指定对象和关系数据之间的映射。Hibernate通过这个文件来生成各种sql语句。 命名规则为 实体类名.hbm.xml 应该和实体类放在同一目录下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <!--根元素,有一常用属性为 package ,当指定了 package 时,后面的类名字就可以简短,例如 package = "com.cad.domain" ,后面 class 标签的name只用写User即可--> <hibernate-mapping> <!-- class 标签指定类和表的对应关系,name为类名,table为表名 class 标签的属性 dynamic-insert属性,默认是 false ,当我们执行插入语句时,会动态生成sql语句,如果我们只为某个字段赋值,其他字段为 null ,但是生成的sql语句还是包含其他字段,例如user有两个属性,我们只为name赋值,生成的sql语句还是 insert into user(name,password)values (?,?),而当我们将该值设置为 true 时,生成的sql语句会仅包含不为 null 的字段,生成的sql语句就是insert into user(name) values (?) class 标签的属性 dynamic-update属性,默认是 false ,当我们执行更新语句时,会动态生成sql语句,如果我们只为某个字段更新,其他字段不变,生成的sql语句还是包含其他字段。而当我们将该值设置为 true 时,生成的sql语句仅包含需要更新的字段 使用上面的两个属性可以提高运行性能,但是Hibernate动态生成sql语句需要的性能很小,所以可以省略--> < class name= "com.cad.domain.User" table= "user" > <!--id标签用来设定持久化类中的OID和表的主键的映射,name为持久化类中的属性,column是数据表中的主键列名 id标签的属性:length 指定列的数据长度 id标签的属性:unsaved-value 指定当主键为某个值时,当做 null 来处理 id标签的属性:access 也可用在<property>标签上 默认值为property,即通过相应的get set方法来访问持久化类的属性,当值为field时,表明使用反射机制直接访问类的属性,不推荐使用,破坏封装性--> <id name= "id" column= "id" > <!-- generator标签用来设定主键生成策略,hibernate内置的几种主键生成策略 1 .increment 适用于代理主键。由Hibernate自动以递增的方式生成主键,每次增量为 1 ,会执行两个sql语句,先从表中查找出最大的id,然后加一,插入当前数据 2 .identity 适用于代理主键。由底层数据库生成主键,依赖数据库的主键自增功能 3 .sequence 适用于代理主键。由底层数据库的序列来生成主键,前提是数据库支持序列。(mysql不支持,oracle支持) 4 .hilo 适用于代理主键。Hibernate根据hilo算法来自己生成主键。 5 . native 适用于代理主键。根据底层数据库对自动生成主键的支持能力选择 identity|sequence|hilo 6 .uuid 适用于代理主键。采用UUID算法生成主键。 7 .assigned 适用于自然主键。由我们自己指定主键值。例如指定身份证号为主键值 --> <generator class = "native" ></generator> </id> <!-- property标签属性 name指定持久化类的属性名称 column 与类属性映射的字段名,如果没有设置,默认用类属性名作为字段名 not- null 指定属性的约束是否为非空,默认 false unique 指定属性的约束是否唯一 type 指定Hibernate映射类型。例如java类型为string,数据库类型为text,那么应该把Hibernate类型设置为Text。有一张对应的表可以查看。如果没有指定映射类型,Hibernate会使用反射机制识别属性的java类型,然后自动使用与之对应的Hibernate映射类型 --> <property name= "name" column= "name" ></property> <property name= "password" column= "password" ></property> </ class > </hibernate-mapping> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)