第5章Hibernate的基本的用法5.5深入理解持久化对象
来源:互联网 发布:雅思网课推荐 知乎 编辑:程序博客网 时间:2024/04/27 21:36
5.5.1 持久化类的要求
虽然Hibernate对持久化类没有太多的要求,但是我们一个遵守如下规则:
*提供一个无参数的构造器
*提供一个标识属性:标识属性通常映射数据库表的主键字段
*尽量避免使用基本数据类型
*为持久化类的每个属性提供setter和getter方法
*使用非final类
*重写equals()和hashCode()方法:如果需要把持久化类的实例放入Set中,则应该为该持久化类重写equals()和hashCode()方法。
5.5.2 持久化对象的状态
瞬态:对象由new操作符创建,且尚未与Hibernate Session 关联的对象被认为处于瞬态。
持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识。
脱管:某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象就变成托管状态。
5.5.3 改变持久化对象状态的方法
5.6 深入Hibernate的映射文件
5.6.1 映射文件结构
<hibernate-mapping>元素下可以拥有多个<class.../>子元素,每个<class.../>子元素对应一个持久化类的映射。
<span style="font-size:18px;"><hibernate-mappping> <class/> <class/> ......</hibernate-mapping></span><hibernate-mapping.../>元素可以指定如下几个可选属性:
<class.../>元素对应一个持久化类。
除name属性之外,<class.../>元素也可指定schema、catalog、lazy来覆盖<hibernate-mapping.../>元素指定的默认行为。除此之外,还可指定如下可选的属性:
5.6.2 映射主键
Hibernate建议为持久化类定义一个标识属性,用于唯一标识某个持久化实例,而标识属性则需要映射到底层数据表的主键。
标识属性通过<id.../>元素来指定。<id.../> 元素的name属性的值就是持久化类标识属性名。
<id.../>元素还可指定如下几个可选属性:
<span style="font-size:18px;"><class name="News" table="news_table"><!--定义标识属性--> <id name="id" column="news_id"> <!--定义主键生成器--> <generator class = "identity"/> </id> <!--用于定义普通属性--> <property.../> <property.../></class></span>
5.6.3 映射普通属性
Hibernate使用<property.../>元素来映射普通属性,配置<property .../>元素时只需要指定一个name属性,name属性映射持久类的属性名。如果想指定属性在数据表里存储的列名,还可以定义column属性来强制指定列名,列名默认与属性名相同。除此之外,<property.../>元素还支持如下几个可选属性:
5.6.4 映射集合属性
映射集合属性时通常需要指定一个name属性,用于表明该集合属性的名称。除此之外,集合元素有如下可选属性。
因为集合属性都需要保存到另一个数据表中,所以保存集合属性的数据表必须包含一个外键列,用于参照到主键列。该外键列通过在<set.../>、<list.../>等集合元素中使用<key.../>子元素来映射。
指定<key.../>元素时可以指定如下可选选项:
在所有的集合映射中,除了<set.../>和<bag.../>元素外,都需要为集合元素的数据表指定一个索引列——用于保存数组索引,或者List的索引,或者Map集合的key索引。
用于映射索引列的元素有如下几个:
5.6.4.1 List集合属性
例子:
1)Person.java
public class Person{//标识属性private Integer id;//普通属性nameprivate String name;//普通属性ageprivate int age;//集合属性,保留该对象关联的学校private List<String> schools = new ArrayList<String>();//...//schools属性的setter和getter方法public void setSchools(List<String> schools){this.schools = schools;}public List<String> getSchools(){return this.schools;}}2)Person.hbm.xml
<?xml version="1.0" encoding="GBK"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.crazyit.app.domain"><class name="Person" table="person_inf"><!-- 映射标识属性 --><id name="id" column="person_id"><!-- 指定主键生成器策略 --><generator class="identity"/></id><!-- 映射普通属性 --><property name="name" type="string"/><property name="age" type="int"/><!-- 映射List集合属性 --><list name="schools" table="school"><!-- 映射集合属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射集合属性数据表的集合索引列 --><list-index column="list_order"/><!-- 映射保存集合元素的数据列 --><element type="string" column="school_name"/></list></class></hibernate-mapping>3)PersonManager.java
//创建并保存Person对象private void createAndStorePerson(){//打开线程安全的session对象Session session = HibernateUtil.currentSession();//打开事务Transaction tx = session.beginTransaction();//创建Person对象Person yeeku = new Person();//为Person对象设置属性yeeku.setAge(29);yeeku.setName("crazyit.org");//创建List集合List<String> schools = new ArrayList<String>();schools.add("小学");schools.add("中学");//设置List集合属性yeeku.setSchools(schools);session.save(yeeku);tx.commit();HibernateUtil.closeSession();}
5.6.4.2 数组属性
数组的集合属性,应该使用<array.../>元素完成映射,而<array.../>元素的子元素、属性等与<list.../>元素的用法完全一样。例子:
<!-- 映射数组属性 --><array name="schools" table="school"><!-- 映射数组属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射数组属性数据表的数组索引列 --><list-index column="list_order"/><!-- 映射保存数组元素的数据列 --><element type="string" column="school_name"/></array>
5.6.4.3 Set集合属性
Set集合属性的映射与List有点不同,但因为Set是无序、不可重复的集合,因此<set.../>元素无须使用<list-index.../>子元素来映射集合元素的索引列。
例子:
<!-- 映射Set集合属性 --><set name="schools" table="school"><!-- 映射集合属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射保存集合元素的数据列,增加非空约束 --><element type="string" column="school_name"not-null="true"/></set>
5.6.4.4 bag元素映射
<bag../>元素即可以映射List集合属性,也可以映射Set集合属性,甚至可以映射Collection集合属性。不管是哪种集合属性,使用<bag.../>元素都将映射成无序集合。集合属性对应的表没有主键。
<bag.../>元素只需要<key.../>元素来映射关联的外键列,而使用<element.../>元素来映射集合属性的元素列。
<!-- 使用bag元素映射集合属性 --><bag name="schools" table="school"><!-- 映射集合属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射保存集合元素的数据列 --><element type="string" column="school_name"not-null="true"/></bag>
5.6.4.5 Map集合属性
Map集合属性需要使用<map.../>元素进行映射,当配置<map.../>元素时也需要使用<key.../>子元素映射外键列。除此之外,Map集合属性还需要映射Map key.Hibernate将以外键列和key列作为联合主键。例子:
1)Person.java
public class Person{//标识属性private Integer id;//普通属性nameprivate String name;//普通属性ageprivate int age;//集合属性,保留该对象关联的考试成绩private Map<String ,Float> scores= new HashMap<String ,Float>();//... //scores属性的setter和getter方法public void setScores(Map<String ,Float> scores){this.scores = scores;}public Map<String ,Float> getScores(){return this.scores;}}2)Person.hbm.xml
<?xml version="1.0" encoding="GBK"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.crazyit.app.domain"><class name="Person" table="person_inf"><!-- 映射标识属性 --><id name="id" column="person_id"><!-- 指定主键生成器策略 --><generator class="identity"/></id><!-- 映射普通属性 --><property name="name" type="string"/><property name="age" type="int"/><!-- 映射Map集合属性 --><map name="scores" table="score"><!-- 映射集合属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射集合属性数据表的Map key列 --><map-key column="subject" type="string"/><!-- 映射保存集合元素的数据列 --><element column="grade" type="float"/></map></class></hibernate-mapping>
5.6.5 集合属性的性能分析
对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载策略就是等系统需要使用集合属性时才从数据库装载关联的数据。
Hibernate对集合属性默认采用延迟加载,在某些特殊的情况下,为<set.../>、<list.../>、<map.../>等元素设置lazy="false"属性来取消延迟加载。
5.6.6 有序集合映射
Hibernate还支持使用SortedSet和SortedMap两个有序集合,当我们需要映射这种有序集合时,应该为<map.../>元素或<set.../>元素指定sort属性,该属性值可以是如下三个值:
*unsorted:映射有序集合时不排序
*natural:映射有序集合时使用自然排序
*java.util.Comparator实现类的类名:使用排序器对有序集合元素进行定制排序
例子:
1)Person.java
public class Person{//标识属性private Integer id;//普通属性nameprivate String name;//普通属性ageprivate int age;//有序集合属性,保留该对象参与的培训private SortedSet<String> trainings= new TreeSet<String>();//...//trainings属性的setter和getter方法public void setTrainings(SortedSet<String> trainings){this.trainings = trainings;}public SortedSet<String> getTrainings(){return this.trainings;}}2)Person.hbm.xml
<?xml version="1.0" encoding="GBK"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.crazyit.app.domain"><class name="Person" table="person_inf"><!-- 映射标识属性 --><id name="id" column="person_id"><!-- 指定主键生成器策略 --><generator class="identity"/></id><!-- 映射普通属性 --><property name="name" type="string"/><property name="age" type="int"/><!-- 映射SortedSet集合属性,使用自然排序增加sort="natural"定义--><set name="trainings" table="training"sort="natural"><!-- 映射集合属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射保存集合元素的数据列,增加非空约束 --><element type="string" column="training_name"not-null="true"/></set></class></hibernate-mapping>
<!-- 映射Set集合属性,指定在内存中排序 --><set name="trainings" table="training"order-by="training desc"><!-- 映射集合属性数据表的外键列 --><key column="person_id" not-null="true"/><!-- 映射保存集合元素的数据列,增加非空约束 --><element type="string" column="training"not-null="true"/></set>
5.6.7 映射数据库对象
在映射文件中创建和删除触发器、存储过程等数据库对象,Hibernate提供了<database-object.../>元素来满足这种需求。使用<database-object.../>元素只有如下两种形式。
1.在映射文件中显示声明create和drop命令:
<span style="font-size:18px;"><hibernate-mapping> ... <database-object> <create>create trigger f_full_content_gen ...</create> <drop>create trigger t_full_content_gen</drop> </database-object></hibernate-mapping></span>2.提供一个类,这个类知道如何组织create和drop命令。这个特别类必须实现org.hibernate.mapping.AuxiliaryDatabaseObject接口。
<span style="font-size:18px;"><hibernate-mapping> ... <database-object> <definition class="MyTriggerDefinition"/> </database-object></hibernate-mapping></span>
如果我们想指定某些数据库对象仅在特定的方言中才可使用,还可在<databae-object.../>元素里使用<dialect-scope.../>子元素来进行配置。
如果仅仅为了根据映射文件来生成数据库对象,则可以使用Hibernate提供的SchemaExport工具,该工具可根据映射文件来生成数据库对象。
- 第5章Hibernate的基本的用法5.5深入理解持久化对象
- hibernate 深入理解持久化对象
- hibernate 深入理解持久化对象
- 第5章Hibernate的基本用法 5.4深入Hibernate的配置文件
- 5.5 深入理解持久化对象:(5.5.2)持久化对象的状态
- 5.5 深入理解持久化对象:(5.5.3)改变持久化对象状态的方法
- 5.5 深入理解持久化对象:(5.5.1)持久化类的要求
- 第5章 Hibernate的基本用法 5.2 Hibernate入门
- Hibernate学习笔记(三)深入理解持久化对象
- Hibernate框架学习之二:深入理解持久化对象
- Hibernate学习之---深入理解持久化对象
- Hibernate持久化的理解
- Hibernate的持久化对象
- 数据库持久化的深入理解
- Hibernate深入理解----02HelloWorld详解(Hibernate.cfg.xml配置文件详解,创建持久化对象详解)
- 如何理解hibernate的持久化
- Hibernate持久化类的理解
- hibernate的持久化对象的状态
- DirectX11 动态缓存
- hadoop 离开安全模式
- CentOS6.4.i686下Oracle安装—包安装失败
- 80个Python经典资料(教程+源码+工具)汇总——下载目录
- 机器学习基石PLA算法c++语言实现
- 第5章Hibernate的基本的用法5.5深入理解持久化对象
- Selenium学习笔记之006:webdriver的八种定位方式
- 使用mybatis遇到的关于条件查询">"以及if test传参的使用问题
- Meta http-equiv属性详解(转)
- Android Studio下配置AndroidAnnotation
- hdojHPU-ACM大一暑期培训练习题1-1 1001字符串统计
- 自定义Toast
- 冒泡
- VMware网络模式介绍