一、对象的三种状态。

  1.对象有三种状态:持久化状态、临时状态、脱管状态(游离状态)

  2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态。

  3.三种状态的说明

    (1)临时状态:临时状态的最明显标识就是它没有被保存到session中。

      一下情况下,java对象进入临时状态:当通过new语句刚刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。

    (2)持久化状态:持久化状态的明显标识就是被保存到了session的缓存中;持久化状态的对象和数据库中的相关记录对应;Session在清理缓存的时候,会根据持久化对象的属性变化,来同步更新数据库;在同一个Session的缓存中,数据库表中的每条记录只对应唯一的持久化对象。

      Session的很多方法都能够触发java对象进入持久化状态。

      * Session的save方法能够把临时对象转变成持久化对象

      * Session的load方法或者get方法返回的对象总是处于持久化状态

      * Session的update、saveOrUpdate和lock方法能够使得游离的对象转变成持久化对象。  

      * 当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存的时候会把这个临时对象也转变成为持久化对象。

    (3)脱管状态(游离状态):处于该种状态的对象不再存在于Session缓存中;一般情况下,游离状态的对象是由持久化状态的对象转变过来的,因此数据库中还可能存在与之对应的记录。

      Session调用一下的方法能够使得对象从持久化状态转变成为脱管状态。

      * 当调用Session的close方法的时候,Session的缓存会被清空,缓存中所有的持久化状态对象都会转变成为脱管状态的对象。如果在应用程序中没有引用变量引用这些游离对象,这个对象就会结束生命周期。

      * Session的evict方法能够从缓存中删除一个持久化状态对象,使得它变成游离状态。当Session的缓存中保存了大量的持久化状态对象的时候,会消耗掉很多内存,为了提高性能,可以考虑调用evict方法,从缓存中删除掉一些持久化对象。

  4.状态转换图

    

二、一对多关系操作

  这里以班级和学生之间的一对多的关系为例。数据库表创建和测试实例:

 DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS classes;
/*
创建班级表
*/
CREATE TABLE classes(
cid BIGINT,
cname VARCHAR(32),
CONSTRAINT classes_pk PRIMARY KEY(cid)
);
INSERT INTO classes(cid,cname) VALUES(1,'一年级二班');
INSERT INTO classes(cid,cname) VALUES(2,'二年级一班');
INSERT INTO classes(cid,cname) VALUES(3,'三年级四班');
/*
创建学生表
*/
CREATE TABLE student(
sid BIGINT,
sname VARCHAR(32),
cid BIGINT,
CONSTRAINT student_pk PRIMARY KEY(sid),
CONSTRAINT student_fk FOREIGN KEY (cid) REFERENCES classes(cid)
);
INSERT INTO student(sid,sname,cid) VALUES(1,'张三',1);
INSERT INTO student(sid,sname,cid) VALUES(2,'李四',1);
INSERT INTO student(sid,sname,cid) VALUES(3,'王五',2);
INSERT INTO student(sid,sname,cid) VALUES(4,'赵六',2);
INSERT INTO student(sid,sname,cid) VALUES(5,'陈七',3);
INSERT INTO student(sid,sname,cid) VALUES(6,'小强',3);

init.sql

  1.单向关联:

    分为单向1-n和单向n-1关联两种。

    单向1-n关联:只能从1的一端访问到n的一端,反过来则不可以;举例,只能从班级对象获取所有关联的学生对象,而不能根据现有的学生对象获取其所在的班级信息。

    单向n-1关联:只能从n的一端访问到1的一端,反过来则不可以;举例,只能从学生对象获取所有关联的班级对象,而不能根据现有的班级对象那个获取其所有学生。

  2.持久化类和映射文件应当进行适当的配置。

    持久化类:在一的一端应当添加Set集合成员变量。如在Classes类中应当添加Set<Student>变量,并设置setter和getter方法。

         在多的一端应当添加一的的一端对应的Class成员变量。如在Student一端应当添加Classes classes,并设置setter和getter方法;

    映射文件,在一的一端应当配置<set>标签以标志其关联的对象,在多的一端应当配置<many-to-one>标签以标志其关联的对象。

  3.映射文件中添加set标签(class标签中)

<set name="students" cascade="save-update">
<key column="cid"></key>
<one-to-many class="com.mysql.hibernate.domain.Student"/>
</set>

    set标签中的几个属性:

      name:对应的持久化类中的set集合的属性名

      cascade:表示级联操作的类型,save-update/all

      table:表示对应的数据库表名。

      inverse:表示是否要维护关系,注意和cascade之间的区别,如果是false表示维护关系,如果是true表示不维护关系。

    key标签:指明关联表的外键名。这里关联表Student的外键是cid。应当注意填写的应当是Student中的外键名,而不是Classes的主键名。

    one-to-manay标签:class属性指明了关联对象的类型,这里表示Calsses对象关联的对象类型是Student

  4.配置文件中应当进行适当的配置

    在hibernate.cfg.xml配置文件中应当进行相应的配置以便对映射文件进行注册。

    使用标签mapping(session-factory标签下):

    <mapping resource="com/kdyzm/moretoone/config/Classes.hbm.xml" />
<mapping resource="com/kdyzm/moretoone/config/Student.hbm.xml" />

三、多对一关系操作

  1.多对一关系中,应当在持久化类中添加一的一端的类型属性,并设置set和get方法

  2.在映射文件中进行相应的配置。

<!-- 多对一标签没有inverse属性,但是还有cascade属性,理解为什么没有inverse属性 -->
<many-to-one name="classes" class="com.kdyzm.moretoone.domain.Classes">
<!-- 描述外键的,表示通过该字段建立起和Classes之间的关系 -->
<column name="cid"></column>
</many-to-one>

  3.标签中的相应属性的说明

    many-to-one标签的name属性:标识当前类中成员变量的名称,class属性标识成员变量所属的类别。

    column标签:name属性标识外键的名称。

  4.注意事项

    many-to-one标签没有inverse属性,因为通过对当前持久化类对应的持久化表进行的CRUD操作就已经在维护关系了,所以不需要也必须不能有该属性。

    many-to-one标签的cascade属性:当设置为save-updat的时候就会自动持久化关联的对象,默认不设置,如果不设置的话,就会在持久化当前对象的时候抛出异常:TransientObjectException

四、inverse属性

  1.在hibernate中inverse属性的取值决定了是由双向关联的哪一方维护表和表之间的关系。inverse=false为主动方,inverse=true为被动方,由主动方负责维护关联关系。

  2.在没有设置inverse属性的时候,两边默认都是false,即默认都维护关系。

  3.设置原则

    在1-n关系中,将n放设置为主动方将有助于改善性能。举例,如果让国家元首记住全国人民的名字是非常困难的,但是要让全国人民都记住国家元首的名字就要简单得多。

    实际上效率提高的真正原因是使用这种原则会少发出update语句。

  4.在建立两个对象的关联的时候,应当同时修改关联两端的响应属性

    classes.getStudents.add(student);

    student.setClasses(classes);

  5.在删除双向关联关系的时候,也应该修改关联两端的对象属性

    classes.getStudents.remove(student);

    student.setClasses(null);

五、cascade属性的取值说明

  

【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】的更多相关文章

  1. hibernate 实体对象的三种状态以及转换关系。

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  2. HIbernate学习笔记3 之 缓存和 对象的三种状态

    一.hibernate一级缓存 *  hibernate创建每个Session对象时,都会给该Session分配一块独立的缓冲区,用于存放Session查询出来的对象,这个分配给session的缓存区 ...

  3. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  4. Hibernate学习2--对象的三种状态以及映射关系的简单配置

    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...

  5. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  6. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  7. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

  8. hibernate对象的三种状态

    对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...

  9. Hibernate之对象的三种状态

    Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...

随机推荐

  1. 开发haproxy管理平台

    1.说明:该脚本仅适用于Linux操作系统2.使用方法: 在该脚本同级目录下要创建一个名字叫做 haproxy 的文件 haproxy 文件内容如下 global log 127.0.0.1 loca ...

  2. Leetcode 254. Factor Combinations

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  3. nginx中将POST数据写到日志里面的正确方式

    http://www.cnblogs.com/meteorx/p/3188647.html

  4. a版本冲刺第八天

    队名:Aruba   队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章  鼎 学号 昨天完成的任务 今天做的任务 明天要做的任务 困难点 体会 408 继续学习第一行代码至第四章,阅读队友代码 着手 ...

  5. sql语法:inner join on, left join on, right join on详细使用方法

    inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有 ...

  6. 常见linux命令释义(第八天)—— Bash Shell 的操作环境

    换了新公司,公司的领导很不错.自己感受比较多的地方是,自己的工作效率明显比以前高了.以前会对频繁变动的需求十分不耐烦,现在接到需求后会仔细的思考,进行整体构建.即使以后需求有变动,也能够比较轻易的在原 ...

  7. Android系统学习小记

    序言 Android 应用的启动到一个页面显示出来,这个过程涉及到点击事件的处理,以及如何启动一个Activity,启动一个Activity之后,如何将Activity中我们的设置的ContentVi ...

  8. 英文写作——冠词的使用(Use 0f Articles)

    1.使用'a','an','the'和不使用冠词的基本规则: <1>泛指,不可数名词不能有任何冠词 <2>泛指,可数,复数名词前不能有冠词 <3>泛指,可数,单数名 ...

  9. Web开发技术发展历史

    Web开发技术发展历史   来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...

  10. Spring中配置和读取多个Properties文件--转

    public class PropertiesFactoryBeanextends PropertiesLoaderSupportimplements FactoryBean, Initializin ...