Hibernate入门实例(5)
Hibernate映射文件配置
hibernate入门实例(5)是接着Hibernate入门实例(3)继续的,所以一定要先看明白
从数据库中某一张表映射到程序中的对象,tb_student对应的实体类Student.java
1 package com.liuyi.bean;
2
3 public class Student
4 {
5 private int id;
6 private String name;
7 private int age;
8
9 public int getId()
10 {
11 return id;
12 }
13 public void setId(int id)
14 {
15 this.id = id;
16 }
17 public String getName()
18 {
19 return name;
20 }
21 public void setName(String name)
22 {
23 this.name = name;
24 }
25 public int getAge()
26 {
27 return age;
28 }
29 public void setAge(int age)
30 {
31 this.age = age;
32 }
33
34 }
- 关于映射文件的配置
hibernate中映射文件的配置也有两种方式:一种也是使用xml,另外一种就是使用Annotation(注解方式,当然这个需要jpa包的支持).
如果映射文件以xml方式配置的话
在hibernate.cfg.xml中<mapping resource=”com/liuyi/bean/student.hbm.xml”/>
tb_student对应的映射文件student.hbm.xml如下:
1 <?xml version="1.0" encoding=\'utf-8\'?>
2 <!DOCTYPE hibernate-mapping PUBLIC
3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5
6 <hibernate-mapping package="com.liuyi.bean">
7 <class name="Student" table="tb_student">
8 <id name=\'id\' column="id">
9 </id>
10 <property name="name" column=\'name\'/>
11 <property name="age" column=\'age\'/>
12 </class>
13 </hibernate-mapping>
hibernate-mapping标签中所有的属性(蓝色表示比较常用的)
schema=”schemaName” (1)
catalog=”catalogName” (2)
default-cascade=”cascade_style” (3)
default-access=”field|property|ClassName” (4)
default-lazy=”true|false” (5)
auto-import=”true|false” (6)
package=”package.name” (7)
(1) schema (可选): 数据库schema的名称。
在hibernate与数据实体的映射文件*.hbm.xml里面指定了shcema文件,则在进行数据库的查询时,所有的查询都会翻译成schema.tablename
(2) catalog (可选): 数据库catalog的名称。
要说schema和catalog有什么具体的区别,我现在也不是特别的清楚,如果就本程序来说的话就是catalog=”db_persion”和schema=”db_person”是没有什么区别的,因为查询都会翻译成db_person.tb_student
(3) default-cascade (可选 – 默认为 none): 默认的级联风格。
设置Hibernate默认的级联风格,该属性的默认值是none。当配置Java属性映射和集合映射还可指定cascade属性,用于覆盖默认的级联风格。如果没有指定,则Hibernate将采用此处指定的级联风格。
(4) default-access (可选 – 默认为 property): Hibernate用来访问所有属性的策略。可以通过实现PropertyAccessor接口 自定义。
指定Hibernate的访问策略,Hibernate默认的访问策略,默认值为property,即使用getter/setter方法来访问属性。如果需要实现自己的属性访问策略,则需要自己提供PropertyAccessor接口的实现类,再在access中设置自定义属性访问策略类的的名字。
(5) default-lazy (可选 – 默认为 true): 指定了未明确注明lazy属性的Java属性和集合类, Hibernate会采取什么样的默认加载风格。
设置Hibernate默认的延迟加载策略,该属性值默认为true ,即启用延迟加载策略。当配置Java属性映射和集合映射时还可指定lazy属性,用于覆盖默认的延迟加载策略。当配置Java属性映射和集合映射时没指定lazy属性,则Hibernate将采用此处的延迟加载策略。
(6) auto-import (可选 – 默认为 true): 指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
提示:如果同一份映射文件中有两个持久化类映射,它们的类名是一样的(只是处于不同的包结构下,它们全限定类名不同,依然是两个不同的类),则应该设置auto-import=”false”;否则Hibernate将无法准确分别两个类,从而导致Hibernate抛出一个异常。
(7) package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名。
提示:<class></class>元素对应一个持久化类,首先必须采用name元素来制定该持久化类映射的持久化的类名,此处的类名应该是全限定的类名。如果不适用全限定的类名,则必须在hibernate-mapping元素里指定package元素,package元素指定持久化类所在的包名。
class标签所有的属性
name=”ClassName” (1)
table=”tableName” (2)
discriminator-value=”discriminator_value” (3)
mutable=”true|false” (4)
schema=”owner” (5)
catalog=”catalog” (6)
proxy=”ProxyInterface” (7)
dynamic-update=”true|false” (8)
dynamic-insert=”true|false” (9)
select-before-update=”true|false” (10)
polymorphism=”implicit|explicit” (11)
where=”arbitrary sql where condition” (12)
persister=”PersisterClass” (13)
batch-size=”N” (14)
optimistic-lock=”none|version|dirty|all” (15)
lazy=”true|false” (16)
entity-name=”EntityName” (17)
check=”arbitrary sql check condition” (18)
rowid=”rowid” (19)
subselect=”SQL expression” (20)
abstract=”true|false” (21)
node=”element-name”
(1) name (可选): 持久化类(或者接口)的Java全限定名。如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。
(2) table (可选 – 默认是类的非全限定名): 对应的数据库表名。
(3) discriminator-value (可选 – 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。它可以接受的值包括 null 和 not null。
(4) mutable (可选,默认值为true): 表明该类的实例是可变的或者不可变的。
(5) schema (可选): 覆盖在根<hibernate-mapping>元素中指定的schema名字。
(6) catalog (可选): 覆盖在根<hibernate-mapping>元素中指定的catalog名字。
(7) proxy (可选): 指定一个接口,在延迟装载时作为代理使用。 你可以在这里使用该类自己的名字。
(8) dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
(9) dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
(10) select-before-update (可选, 默认为 false): 指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQL UPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transient object)关联到一个新的session中时执行的update()中生效),这说明Hibernate会在UPDATE 之前执行一次额外的SQL SELECT操作,来决定是否应该执行 UPDATE。
(11) polymorphism(多态) (可选, 默认值为 implicit (隐式) ): 界定是隐式还是显式的使用多态查询(这只在Hibernate的具体表继承策略中用到-译注)。
(12) where (可选) 指定一个附加的SQLWHERE 条件, 在抓取这个类的对象时会一直增加这个条件。
(13) persister (可选): 指定一个定制的ClassPersister。
(14) batch-size (可选,默认是1) 指定一个用于根据标识符(identifier)抓取实例时使用的”batch size”(批次抓取数量)。
(15) optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。
(16) lazy (可选): 通过设置lazy=”false”, 所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。
(17) entity-name (可选,默认为类名): Hibernate3允许一个类进行多次映射(前提是映射到不同的表),并且允许使用Maps或XML代替Java层次的实体映射(也就是实现动态领域模型,不用写持久化类-译注)。
(18) check (可选): 这是一个SQL表达式,用于为自动生成的schema添加多行(multi-row)约束检查。
(19) rowid (可选): Hibernate可以使用数据库支持的所谓的ROWIDs,例如: Oracle数据库,如果你设置这个可选的rowid, Hibernate可以使用额外的字段rowid实现快速更新。ROWID是这个功能实现的重点,它代表了一个存储元组(tuple)的物理位置。
(20) subselect (可选): 它将一个不可变(immutable)并且只读的实体映射到一个数据库的子查询中。当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。更多的介绍请看下面内容。
(21) abstract (可选): 用于在<union-subclass>的继承结构(hierarchies)中标识抽象超类。
id
被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性,为每一个实例包含唯一的标识。<id> 元素定义了该属性到数据库表主键字段的映射。
name=”propertyName” (1)
type=”typename” (2)
column=”column_name” (3)
unsaved-value=”null|any|none|undefined|id_value” (4)
access=”field|property|ClassName” (5)
length=”L” (6)
(1) name (可选): 标识属性的名字。用来标识类的某一个属性
(2) type (可选): 标识Hibernate类型的名字。(如果没配置,hibernate将会自动转化成相应的数据库类型)
(3) column (可选 – 默认为属性名): 主键字段的名字。标识对应表中的某一列名.
(4) unsaved-value (可选 – 默认为一个切合实际(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。这可以把这种实例和从以前的session中装载过(可能又做过修改–译者注)但未再次持久化的实例区分开来。
(5) access (可选 – 默认为property): Hibernate用来访问属性值的策略。
(6)length=”L”指定长度
property
<property>元素为类定义了一个持久化的,JavaBean风格的属性。
name=”propertyName” (1)
column=”column_name” (2)
type=”typename” (3)
update=”true|false” (4)
insert=”true|false” (4)
formula=”arbitrary SQL expression” (5)
access=”field|property|ClassName” (6)
lazy=”true|false” (7)
unique=”true|false” (8)
not-null=”true|false” (9)
optimistic-lock=”true|false” (10)
generated=”never|insert|always” (11)
(1) name: 属性的名字,以小写字母开头。
(2) column (可选 – 默认为属性名字): 对应的数据库字段名。也可以通过嵌套的<column>元素指定。
(3) type (可选): 一个Hibernate类型的名字。
(4) update, insert (可选 – 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个)字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。
(5) formula (可选): 一个SQL表达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据库字段。
(6) access (可选 – 默认值为 property): Hibernate用来访问属性值的策略。
(7) lazy (可选 – 默认为 false): 指定指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。
(8) unique (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。
(9) not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。
(10) optimistic-lock (可选 – 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
(11) generated (可选 – 默认为 never): 表明此属性值是否实际上是由数据库生成的。
虽然每个标记都有这么多,但我们一般只要知道常用的就行了,了解有某一个属性就好了,到了真正要用再去查文档就OK了!
映射文件的配置,我们已经基本完成,下面来写测试代码:
TestStudent.java
1 package com.liuyi.main;
2
3
4 import org.hibernate.Session;
5 import org.hibernate.SessionFactory;
6 import org.hibernate.cfg.Configuration;
7
8 import com.liuyi.bean.Student;
9
10 public class TestStundent
11 {
12 public static void main(String args[])
13 {
14 Student stu=new Student();
15 SessionFactory sessionFactory= new Configuration().configure().buildSessionFactory(); //加载主配置文件得到SessionFactory工厂
16 Session session=sessionFactory.openSession(); //打开一个新的session
17 session.beginTransaction(); //事务开始
18 stu.setAge(20);
19 stu.setId(1);
20 stu.setName("刘镱");
21 session.save(stu); //保存一个对象
22 session.getTransaction().commit(); //得到当前事务并提交
23 session.close(); //session 关闭
24 sessionFactory.close(); //SessionFactory 关闭
25 }
26 }
运行完后,数据库中会多一条记录为id为1的数据
以上讲解了使用xml做为映射文件,下讲将会涉及使用Annotation来配置映射!