




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十三章Hibernate配置和会话
Hibernate的配置包括两个重要部分,一个是Hibernate的配置文件Hibernate.cfg.xml,一个是实体类的映射文件,本章将对这两个配置文件进行详细介绍。本章还将一种最新的配置映射关系的方式,使用Annotations配置映射,从而省去繁琐的映射配置文件。本章最后将介绍Hibernate的三种对象状态以及Session的各方法和应用。重点内容:使用XML文件配置Hibernate
配置映射文件使用Annotations配置映射
Hibernate的三种对象状态
Session的各方法以及其应用一、配置Hibernate1.使用XML文件配置Hibernate
使用XML文件配置Hibernate,是目前最常用的配置方式,同样也是Hibernate官方推荐的配置方式。Hibernate默认的配置文件为hibernate.cfg.xml,不过读者也可以使用其他文件名,到时候再在HibernateSessionFactory类中修改配置文件路径就可以了。
在Hibernate配置文件同样有DTD规范,并规范该文件的根节点为<hibernate-configuration>,其代码如下所示。<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration></hibernate-configuration>一、配置Hibernate2.使用资源文件配置Hibernate
在Hibernate3以前开发人员一般使用资源文件配置Hibernate,资源文件的格式是键值对形式的。使用资源文件配置Hibernate时,将属性名称作为key值,属性值作为value值。资源文件的后缀名为.properties,需要将该文件放置于CLASSPATH环境变量指定路径的根目录下,在MyEclipse中可以将其直接放置在src根目录下。hibernate.connection.url=jdbc:mysql://localhost:3306/javawebhibernate.connection.username=roothibernate.connection.password=adminhibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.show_sql=true一、配置Hibernate3.代码动态配置Hibernate
前面介绍的两种方式都是在配置文件进行的配置,这类配置在程序运行中是无法修改的。下面再来介绍一种配置Hibernate的方式,那就是在代码中动态配置Hibernate。configuration=newConfiguration(); configuration. setProperty("connection.url","jdbc:mysql://localhost:3306/javaweb");configuration.setProperty("connection.username","root");configuration.setProperty("connection.password","admin");configuration.setProperty("dialect","org.hibernate.dialect.MySQLDialect");configuration.setProperty("connection.driver_class","com.mysql.jdbc.Driver");configuration.setProperty("show_sql","true");二、配置映射文件1.<hibernate-mapping>元素
映射文件的根节点为<hibernate-mapping>,该节点包含一系列可选的属性,如schema和catalog属性。其中schema属性用来指定数据库表所在的schema名称。如果指定了schema属性,表名则会加上所指定的schema的名字扩展为全限定名;如果没有指定该属性,则不会使用全限定名。<hibernate-mapping>的所有属性以及属性说明如下表所示。二、配置映射文件2.<hibernate-mapping>元素
<class>元素用来配置一个实体类与一个数据库表的关联,其中name属性用来指定实体类的类名,table属性用来指定数据库表的名称。<class>元素除了常用的name属性和table属性外还有其他一些常用属性如下表所示。二、配置映射文件3.<id>元素
每一个实体类中都包含一个唯一的标识,<id>元素能够定义该属性和数据库表中的主键字段的映射。<id>元素同样包含许多的属性,其中name属性用来指定标识属性的名称,type属性用来指定标识属性的Hibernate类型,column属性用来指定数据库表中主键字段的名称。<id>元素还有其他一些常用属性如下表所示。二、配置映射文件4.<property>元素
实体类的标识和数据库表的主键映射完成后,还需要为实体类的其他属性和数据库的其他字段进行映射,这个时候就需要使用到<property>元素。<property>元素的常用属性如下表所示。二、配置映射文件5.其他元素
<class>元素下除了可以添加<id>元素和<property>元素外,还可以添加其他元素。这些元素同样非常重要,本书将在后面的章节进行重点介绍,这里只做简单概述。◆ <timestamp>元素◆ <version>元素◆ <one-to-one>元素◆ <many-to-one>元素◆ <import>元素三、使用Annotations配置映射1.使用@Entity注释实体类
@Entity注释用来将一个普通的JavaBean标注为实体类。@Entity注释有一个可选的name属性,用来设置实体名,其默认值为JavaBean的类名。
并不是所有的JavaBean都能被标注为实体类,必须满足如下三个条件。1.JavaBean类的访问权限只能是public。2.JavaBean类不能是抽象类。3.JavaBean中必须有一个无参的构造方法,而且该构造方法的访问权限只能是public。三、使用Annotations配置映射2.使用@Table注释实体类
@Table注释用来对实体类进行进一步注释,用来配置实体类到数据库表映射的更详细的信息。@Table注释包含四个属性,分别为catalog、name、schema以及uniqueConstraints。1.catalog属性。2.name属性。3.schema属性。4.uniqueConstraints属性。三、使用Annotations配置映射3.使用@Id注释实体类标识
@Id注释用来对实体类的标识进行配置,一个实体类一般只有一个标识,所有一个实体类只出现一个@Id注释。publicclassEmployee{ @Id privateStringemployeeID; publicStringgetEmployeeID(){ returnemployeeID; }}三、使用Annotations配置映射4.使用@GenerateValue注释覆盖标识的默认访问策略
使用@Id注释实体类标识时将采用Hibernate的默认访问策略,这时可以使用@GenerateValue注释来覆盖该默认访问策略。@GenerateValue注释包含两个属性,分别为generator和strategy。
1.generator属性,该属性用来指定标识生成器名。标识生成器可以通过@SequenceGenerator、@TableGenerator和@GenericGenerator来创建,generator属性只需要指定为这些生成器的name属性值即可。
2.strategy属性,该属性用来用来指定标识生成策略。strategy的属性值为一个枚举类型。三、使用Annotations配置映射5.使用@GenericGenerator注释生成标识生成器 前面介绍了如何使用@GenerateValue注释的strategy属性来指定标识生成策略,但是这些生成策略明显不能满足。这时可以使用@GenericGenerator注释产生标识生成器,然后通过@GenerateValue注释的generator属性来指定该生成器的name属性,这样就可以采用指定的生成器来生成标识。
@GenericeGenerator注释是在Hibernate中定义的,其注释类在org.hibernate.annotations包下,使用该注释可以使用Hibernate内置的各种生成策略从而生成标识。@GenericeGenerator注释包含三个属性,分别为name、parameters和strategy。1.name属性,该属性用来设置标识生成器名。2.parameters属性,该属性用来设置标识生成器所需的参数。3.strategy属性,该属性用来设置Hibernate内置的生成策略。三、使用Annotations配置映射5.使用@GenericGenerator注释生成标识生成器 前面介绍了如何使用@GenerateValue注释的strategy属性来指定标识生成策略,但是这些生成策略明显不能满足。这时可以使用@GenericGenerator注释产生标识生成器,然后通过@GenerateValue注释的generator属性来指定该生成器的name属性,这样就可以采用指定的生成器来生成标识。
@GenericeGenerator注释是在Hibernate中定义的,其注释类在org.hibernate.annotations包下,使用该注释可以使用Hibernate内置的各种生成策略从而生成标识。@GenericeGenerator注释包含三个属性,分别为name、parameters和strategy。1.name属性,该属性用来设置标识生成器名。2.parameters属性,该属性用来设置标识生成器所需的参数。3.strategy属性,该属性用来设置Hibernate内置的生成策略。三、使用Annotations配置映射6.使用@Column注释实体类非标识属性 一个实体类除了有标示,一般还会有许多的其他属性,这时可以使用@Column注释这些属性。@Column注释最常用的属性为name属性,该属性用来配置数据库表中的字段名。如果不设置该属性值,那么将表示实体类属性名和数据库表字段名一样。@Column(name="employeeName")privateStringemployeeName; @Column(name="employeeSex")privatebooleanemployeeSex; @Column(name="employeeBirth")privateDateemployeeBirth; @Column(name="employeePhone")privateStringemployeePhone; 三、使用Annotations配置映射7.自定义AnnotationSessionFactory类来获得Session对象 前面介绍了如何使用Annotations注释来完成实体类到数据库表的映射,这时还有一点需要特别注意。在以前获得SessionFactory对象是通过调用Configuration对象的buildSessionFactory方法来实现,但是这种方式仅仅支持映射文件方式的映射,不支持Annotations注释映射。 要支持Annotations注释映射必须使用AnnotationConfiguration类,通过该类实例对象的buildSessionFactory方法来获得SessionFactory实例对象。 三、使用Annotations配置映射8.测试Annotations注释是否成功完成映射 通过AnnotationSessionFactory可以加载Annotations注释方式的映射,同样可以通过其buildSessionFactory方法获得SessionFactory对象,同时还可以通过其getSession方法获得Session对象。通过调用Session的对象各种方法就可以完成各类数据库操作,如查询记录、添加记录等等。 在创建测试类之前,首先同样需要在Hibernate配置文件hibernate.cfg.xml中添加映射信息。同映射文件配置映射不同,这里需要使用在<mapping>元素中指定其class属性为需要映射的实体类,代码如下所示。<mappingclass="com.sanqing.po.Employee"/>
完成如上步骤以后,映射信息就已经全部完成了,下面就来创建一个测试类来测试使用Annotations注释是否成功完成映射。
四、会话(Session)的应用1.Hibernate对象状态 一个实体类的实例可能处于三种不同状态中的一种,这三种状态分别是瞬时状态、持久状态、托管状态。下面来看这三种状态的详细说明。各状态转换提交得到其转换图如图所示。
四、会话(Session)的应用2.使用save方法持久化对象 使用new关键字创建的对象并没有保存到数据库当中,这时的对象为瞬时状态,通过Session对象的save方法能够将其转换成持久状态,并同时在数据库表中添加相应记录。
save方法两有种重载形式,其代码如下。
publicSerializablesave(Objectobject)throwsHibernateException; publicSerializablesave(StringentityName,Objectobject)throwsHibernateException;
其中Object参数用来设置实体类的实例名,entityName参数用来设置实体类的类名。我们通常只是用第一种重载形式的save方法。
四、会话(Session)的应用3.使用saveOrUpdate方法持久化对象 使用save方法虽然能够完成对象的持久化,但是有时候容易出现问题,比如一个对象已经被持久化了,这时候再次调用save方法将抛出异常。使用saveOrUpdate方法可以很好的解决这一问题,它会自动判断该对象是否已经持久化,如果已经持久化了将执行更新操作,如果没有持久化才进行添加操作。
saveOrUpdate方法有两种重载形式,其代码如下。
publicvoidsaveOrUpdate(Objectobject)throwsHibernateException; publicvoidsaveOrUpdate(StringentityName,Objectobject)throwsHibernateException; saveOrUpdate方法中的参数含义和save方法是完全一样的。来设置实体类的类名。我们通常只是用第一种重载形式的save方法。
四、会话(Session)的应用4.使用load方法装载对象 如果知道某个对象的持久化标识,就可以使用Session对象的load方法从数据库装载数据,使用load方法装载的对象是持久状态的。load方法有五种重载形式,其代码如下。
publicObjectload(ClasstheClass,Serializableid)throwsHibernateException; publicObjectload(StringentityName,Serializableid)throwsHibernateException; publicvoidload(Objectobject,Serializableid)throwsHibernateException; publicObjectload(StringentityName,Serializableid,LockModelockMode)throwsHibernateException; publicObjectload(ClasstheClass,Serializableid,LockModelockMode)throwsHibernateException;四、会话(Session)的应用5.使用get方法装载对象 使用load方法虽然能够装载对象,但是如果装配的对象不存在,load方法仍然会返回一个持久对象该持久对象除了标识属性外,访问器其他属性或者方式时,都将抛出无法恢复的异常。这时可以使用get方法,当装配的对象不存在时将返回一个null值,这样就可以避免异常的出现。
get方法有四种重载形式,其代码如下。
publicObjectget(Classclazz,Serializableid)throwsHibernateException; publicObjectget(StringentityName,Serializableid)throwsHibernateException; publicObjectget(StringentityName,Serializableid,LockModelockMode)throwsHibernateException; publicObjectget(Classclazz,Serializableid,LockModelockMode)throwsHibernateException;四、会话(Session)的应用6.使用refresh方法刷新对象 使用refresh方法能够根据数据库中的数据来刷新持久对象中的属性值。get方法有两种重载形式,其代码如下。
publicvoidrefresh(Objectobject)throwsHibernateException; publicvoidrefresh(Objectobject,LockModelockMode)throwsHibernateException;
其中object参数用来设置需要刷新的持久对象。四、会话(Session)的应用7.使用setFlushMode方法设置更新模式 当持久对象的属性值发送变化后,Hibernate会根据情况自动将这些更新的属性值进行持久化。那到底是在什么情况下会进行自动更新呢?可以通过getFlushMode方法来获得当前的更新模式,也可以通过setFlushMode方法来修改默认的更新模式。getFlushMode方法和setFlushMode方法代码如下。
publicvoidsetFlushMode(FlushModeflushMode); publicFlushModegetFlushMode();
其中flushMode参数用来设置更新模式,该参数有四个可选值,分别为FlushMode.MANUAL、FlushMode.COMMIT、FlushMode.AUTO、FlushMode.ALWAYS。四、会话(Session)的应用8.使用isDirty方法判断数据是否一致 有时候我们需要判断当前更新的持久对象和数据库中的数据是否保持一致,这时就可以Session对象的isDirty方法完成该判断。isDirty方法可以判断持久对象中的属性值是否和数据表中相应的字段的值保持一致。如果一致,返回false;否则,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2019-2025年消防设施操作员之消防设备基础知识模拟考试试卷A卷含答案
- 2019-2025年消防设施操作员之消防设备中级技能题库练习试卷B卷附答案
- 2019-2025年消防设施操作员之消防设备基础知识题库练习试卷A卷附答案
- 人民防空知识培训课件
- 酒店推广佣金合同(2篇)
- 采购分包付款合同(2篇)
- 宫颈癌疫苗知识培训课件
- 2025年爱国知识竞赛题及答案(67题)
- 文化遗产保护与传承合作协议
- 细胞制备服务合作协议
- 新教材 人教版高中物理选择性必修第一册 第三章 机械波 知识点考点重点难点提炼汇总
- 项目经理培训课件
- 体系基础知识培训
- 同课异构知识讲座
- 计算机应用基础(Windows10+Office2016)
- 支气管肺炎个案护理查房
- 九年级数学一轮复习全部教案
- 调车作业和安全管理
- 特许经营管理手册范本(餐饮)
- 旅游急救知识教案完整版
- 混床计算书(新)
评论
0/150
提交评论