Hibernate1-概述
1. 什么是hibernate?
- 在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架;
- Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架;
- Hibernate是对JDBC API的封装,是JDBC轻量级封装框架。
2.Hibernate配置文件两种方式:
- hibernate.properties (键=值方式):默认名字为:hibernate.propeties
- hibernate.cfg.xml
3.创建持久化类
持久化类:指其实例需要被Hibernate持久化到数据库中的类即实体类
- private 类型属性;
- public 类型的 setter 和 getter 方法;
- public 或 protected 类型的无参数的构造方法。
4.创建持久化类的配置文件
- 创建持久化类的配置文件。描述持久化类与数据库表之间的对应关系。
5.创建持久化类的配置文件
<hibernate-mapping package="com.hibernate.entity">
<class name="Customer" table="CUSTOMER">
<id name="id" type="int" >
...
</id>
<property name="name" type="java.lang.String">
...
</property>
...
</class>
</hibernate-mapping>
- id 和 property 元素不能颠倒位置
- <class>元素用于指定类和表之间的映射。
name属性设定类名(包含路径);
table属性设定表名,默认以类名作表名。
<class name="Customer" table="CUSTOMER">
...
</class>
- <class>元素包含一个子元素及多个子元素。
- id 子元素设定持久化类的OID和表的主键的映射关系。
column – 指定表字段的名称;
generator – 元素指定OID的生成器。
<id name="id" type="int">
<column name="ID"/>
<generator class="native"/>
</id>
- property 子元素设定类的其他属性和表的字段的映射关系。
name – 对应类的属性名称;
type – 指定属性的类型;
column – 指定表字段的名称;
not-null – 指定属性是否允许为空。
<property name="name" not-null="true"
type="java.lang.String">
<column name="NAME"/>
</property>
Hibernate2-对象标识符映射
1关系型数据库中区分不同记录。
-
数据库中用主键来标识唯一性记录。
-
主键必须满足的条件:
不允许null;
每条记录必须有唯一的主键值,主键值不能重复;
每条记录的主键值不能改变。 -
主键分类:
业务(自然)主键:具有实际意义;
代理主键:没有实际意义。
2.Java程序中区分不同对象。
- Java语言中通过内存地址区分不同对象;
- 两种比较引用变量方法;
“==” 比较两个变量引用的内存地址是否相同;
equals 比较两个变量引用的对象的值是否相同。 - 用户自定义的类也可以覆盖Object的equals方法实现对象按值进行比较。
3.Hibernate中如何区分对象
Hibernate 采用对象标识符(OID)区分对象。
- OID 是关系数据库表中的主键(通常是代理主键)在 Java 对象模型中的等价物;
- Hibernate 采用 OID 来维持Java持久化类和数据库表中对应关系;
- Object Identifier。
4.Hibernate中的OID
- OID 与表中代理主键对应,OID 也是整数类型,Hibernate 允许在持久化类中把OID定义为以下三种类型:
Short
Integer
Long - 为了保证 OID 的唯一性,通常由 Hibernate 或底层数据库给 OID 赋值。
5.映射文件中OID的配置
在对象-关系映射配置文件中元素的子元素用来设置 OID。
- <generator>子元素用来指定OID的生成器。
<class name="User" table="USER">
<id name="id" type="int" >
<generator class="identity" />
</id>
……
</class>
6.标识符生成器
Hibernate 自带了很多种标识符生成器:
- increment 采用 Hibernate 数值递增的方式;
-increment 标识符:该机制是 Hibernate 以递增的方式为OID赋值。
-不依赖于底层数据库系统,适合所有数据库;
-适合单独的 Hibernate 应用使用,不适合在集群情况下使用。
<id name="id" type="int" >
<generator class="increment" />
</id>
- identity 采用数据库提供的自增长方式;
-identity 标识符:该机制依赖于底层数据库,需要数据库支持自动增长字段。
-例如:MySQL、MSSQL、DB2、Sybase等。
<id name="id" type="int" >
<generator class="identity" />
</id>
- assigned 主键由应用逻辑产生;
-assigned 标识符:该机制是由外部程序负责生成 OID, Hibernate 不负责维护主键生成,与Hibernate和底层数据库都无关。
-例如: Student 类没有定义 ID,而是以学号 studentNo 作为业务主键。
<id name="studentNo" type="string" >
<generator class="assigned" />
</id>
- sequence 采用数据库提供的序列方式;
- native 自动选择合适的标识符生成器;
Hibernate3-一对多关系映射
1实体之间的联系(Relationship)
- 现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。(理解)
- 实体间联系可分为:
一对一联系(1:1);
一对多联系(1:n);
多对多联系(m:n)。
2.数据库表体现一对多关联
- 在关系模型中,只存在外键参照关系,而且是 many 方参照 one 方。
3.Hibernate单项一对多关联
- 在 User 中定义一个 Order 的引用集合,而在 Order 中无需作任何定义。
public class User {
private Integer id;
private String userName;
private String password;
private Set orderSet = new HashSet<Order>();
......
}
public class Order {
private Integer id;
private Double price; // 价格
......
}
- 映射配置文件:在 User.hbm.xml 文件中使用 元素配置。
<set name="orderSet" cascade="delete">
<key column="USERID"/>
<one-to-many class="Order" />
</set>
<set>元素属性:
name属性:指定要映射的属性名;
cascade级联操作属性:save-update、delete、all、none(默认)。
<set>元素的子元素:
<key>元素:column 属性设定所关联类对应表的外键;
<one-to-many>元素:class 属性设定所关联的类。
4.Hibernate双向一对多关联
- 建立 User 和 Order 的双向一对多关联。
在 User 到 Order 单向一对多关联关系基础上,在 Order 类中增加 User 类型的属性。
public class Order {
private Integer id;
private Double price; // 价格
private User user;
......
}
- 映射配置文件:Order.hbm.xml 中添加 user 属性的映射。
<many-to-one name="user" column="USERID" class="User"/>
<many-to-one>元素的属性:
name 属性:指定需映射的属性名;
column 属性:指定ORDER中的外键列名;
class 属性:指定所关联的类型。
hibernate4-一对一关联映射
1.Hibernate一对一关联关系映射
- Hibernate提供两种映射一对一关联关系的方式:
- 主键关联映射;
- 唯一外键关联映射。
外键必须设定 unique 约束。
①主键关联映射
关系数据模型:
主键表(USER):
通过<one-to-one>元素配置:cascade属性(级联属性)为 all。
User.hbm.xml
<one-to-one name="person" class="Person"
cascade="all"/>
外键表(PERSON ):
通过<one-to-one>>元素配置:
constrained 属性为 true,表明 PERSON 表 ID 为外键,参照主表(USER)。
外键表实体类配置文件中 OID 使用 foreign 生成策略。
Person.hbm.xml
<id name="id" >
<generator class="foreign" >
<param name="property" >user</param>
</generator>
</id>
<one-to-one name="user" constrained="true" />
②唯一外键关联映射
关系数据模型:
外键表(USER):通过<many-to-one> 元素配置。
column 属性指明外键列;
unique 属性设置为 true,表明唯一约束;
cascade 属性设置为 all,表明删除 USER 时同时删除 PERSON。
<many-to-one name="person" column="PERSONID"
cascade="all" unique="true"/>
主键表(PERSON):通过<one-to-one> 元素配置。
property-ref 属性,表明建立了从User到Person的一对一关联关系。
<one-to-one name="user" property-ref="person"/>
Hibernate5-多对多关联映射
1.实体多对多关联关系
2.数据库多对多关联关系
3.Hibernate多对多关联映射
实体类:
- Student.java
public class Student {
private int id;
private String name;
private String studentNo;
private Set<Course> courseSet
= new HashSet<Course>();
......
}
- Course.java
public class Course {
private Integer id;
private String name; // 课程名称
private int credit; // 学分
private Set<Student> studentSet
= new HashSet<Student>();
......
}
- Student.hbm.xml
<set name="courseSet" table="STUDENTCOURSE"
(table中间表的表名)inverse="false">
<key column="STUDENTID"/>(当前对象对应的数据库表在第三张表中的所对应的外键的名称)
<many-to-many class="Course" column="COURSEID"/>
(当前对象所关联对象的数据库表在第三张表对应外键的名称)
</set>
- Course.hbm.xml
<set name="studentSet" table="STUDENTCOURSE"
inverse="true">
<key column="COURSEID"/>
<many-to-many class="Student" column="STUDENTID"/>
</set>
- <set>元素属性。
name属性:指定类的属性名;
table属性:指定多对多关联关系中间表;
cascade级联操作属性:save-update、delete、all、none。
<set>子元素。
<key>元素:设定实体类对应表的外键;
<many-to-many>元素中class属性:设定关联类型。 - inverse 是 Hibernate 中双向关联关系中的基本概念,用来设置关系由哪一方来维护。
inverse=true 表示被控方,=false 表示主控方;
在多对多关系中需要设置哪一方为被控方,即设置inverse=true 。
待续...