hibernate映射文件的作用是完成实体到数据库的双向映射。
为了更好的阐述实体与映射文件的关系,首先建一个实体。
1.创建一个实体类,并且在数据库创建相应的数据表
package com.zy.pojo;
public class Coach {
private int id;
private String name;
private String detail;
private String img;
private int age;
public int getId() {return id;}
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getDetail() {return detail;}
public void setDetail(String detail) {this.detail = detail;}
public String getImg() {return img;}
public void setImg(String img) {this.img = img;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
}
所有的持久化类(persistent classes)都要求有无参的构造器,因为 Hibernate 必须使用 Java 反射机制来为你创建对象。构造器(constructor)的访问级别可以是 private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是 package 级别的访问控制
映射文件
(1)基本结构:
Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映射文件发挥作用的地方。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。
映射文件的基本结构:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.pojo">
...
</hibernate-mapping>
其中package属性指的是存放实体类的包,它不是必要的,你可以在后面的class标签上去配置实体的全额限定名。
(2)实体类映射到数据表:
在 hibernate-mapping
标签(tag)之间, 含有一个 class
元素。所有的持久化实体类(再次声明,或许接下来会有依赖类,就是那些次要的实体,比如学生实体里含有老师信息的实体)都需要一个这样的映射,来把类对象映射到 SQL 数据库里的表:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.pojo" >
<class name="Coach" table="coach">
...
</class>
</hibernate-mapping>
(3)主键生成策略:
前面已经完成了实体类持久化到数据库表里面,现在我们将继续讨论有关唯一标识符属性到数据库表的映射。另外,由于我们不关心怎样处理这个标识符,我们就配置由 Hibernate 的标识符生成策略来产生代理主键字段:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.pojo" >
<class name="Coach" table="coach">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
....
</class>
</hibernate-mapping>
id
元素是对 identifier 属性的声明。name="id"
映射属性声明了 JavaBean 属性的名称并告诉 Hibernate 使用 getId()
和 setId()
方法来访问这个属性。column 属性告诉 Hibernate 数据库Coach 表的哪个字段持有主键值。
嵌套的 generator
元素指定标识符的生成策略(也就是标识符值是怎么产生的)。
generator元素的class属性取值详解:
取值 | 说明 |
---|---|
identity | 用于MySql数据库。特点:递增。 |
sequence | 用于Oracle数据库。 |
native | 跨数据库时使用,由底层方言产生。 |
hilo | 通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。 |
sequencehilo | 同过高低位合成id,建一个sequence序列,不用建表。 |
assigned | 用户自定义id。 |
foreign | 用于一对一关系共享主健时,两id值一样。 |
(4)持久化属性声明
默认情况下,类里面的属性都被视为非持久化的。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.pojo" >
<class name="Coach" table="coach">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="name" type="string"/>
<property name="detail" column="detail" type="string"/>
<property name="img" column="img" type="string"/>
<property name="age" column="age" type="int"/>
</class>
</hibernate-mapping>
property标签的属性详细清单:
<property>标签属性:
(1)name: 属性的名字,以小写字母开头。
(2)column:可选 ,对应的数据库字段名。默认为属性名字。 也可以通过嵌套的<column>元素指定。
(3)type:可选,属性的类型。可以是hibernate的类型,也可以是java类型,若是配置成java类型,则需要使用全限定类名。
(4)unique:可选,使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。
(5)not-null: 可选,使用DDL为该字段添加可否为空(nullability)的约束。
(6)length:指定该属性映射的数据列的长度。
(5) 映射类型
property标签还有一个type属性,它用于映射类型,它们能把 Java 数据类型转换到 SQL 数据类型,具体的后面讲述。