hibernate入门笔记(3)

原创 2007年10月08日 14:50:00

day3


持久化对象,即就是在数据库中存有其相对应数据的对象,并且在内存中也有这个对象,这个对象在Session的管理范围内,也就是调用过save()方法同步到数据库的对象。

临时对象,即在内存中刚刚创建的对象,还没有同步到数据库,或者是数据库中信息被删除了的对象也是临时状态。

游离对象,也就是在数据库中有和该对象向对应的纪录,并且在内存中的也存在该对象,但是不在Session的管理范围之内,也就是在Session关闭之后,就成了游离对象,就不会在将其改变同步到数据库中,如果要使还想令其成为持久化对象就要在把它纳入Session管理中,也就是掉用Session中的update()方法就可以了。


及物的持久化,也就是说针对这个对象的属性进行持久化操作,也就是通过级联进行设置。

以下是一对多中一端set标签的设置
<set name="st" inverse="true" cascade="delete" batch-size="3">
   <key column="cid"/>
   <one-to-many class="Student"/>
</set>
inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库。

cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,
cascade="none",cascade="save-update",cascade="delete",cascade="all" cascade="persist"
cascade="delete-orphan",cascade属性的值常用的设置为以上五项:

none就是不使用级联操作,默认级联是none。

save-update也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。

persist就只是将级联对象也持久化到数据库。

delete对持久化对象的删除操作时会进行级联操作关联对象(子对象)。

all对持久化对象的所有操作都会级联操作关联对象(子对象)。

all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。

batch-size这个属性只能够写在set标签中,这个属性带表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,而不是默认的一个一个的加载,会提高效率,批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。

lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。

fetch="join",这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch="join",就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch="join"就会使用表连接将关联对象信息直接查寻出来的。fetch="lazy"这个是默认的设置。

注意:
在使用fetch="join"要区分开他和外连接的区别,他不会忽略配置文件中的加载策略,而使用了外连接就会忽略配置文件中使用了外连接的一端的所有加载策略,而替之为立即加载。

例:班级 tream,身份证 Certigicate 学生 student
身份证和学生是一对一关系,班级和学生是一对多的关系。学生对身份证的加载策略是预先抓取,学生对班级是预先抓取,但是班级对学生是延迟加载。
现在使用了外连接
Query q=session.createQuery("from Student as s left join s.team");
as 的语法是取别名的语法。
也就是使用了外连接的来查寻班级,这样就会忽略,学生对象对其所有属性除了使用外连接查寻的属性,而其余都会使用立即加载。

<property name="" column="" type="" not-null="true">,这样也就会使这个属性不能够为空值

查询对象,可以使用get()和load()方法,不过前提是必须知道该对象持久化时的唯一标识,也就是id,和这个对象的类对象。

hibernate的HQL中的select和update语法

select 别名 from 类全名 别名 where 别名.类属性=:变量名

如果要查寻全部可以简写为from 类全名

update 类全名 set 属性名=:变量名 where 属性名=:变量名

注意以上这些语句要在createQuery("...")中。

多对多的映射实现

一般多对多关联会拆分成两个一对多的关系来实现多对多关系,也可以通过hibernate提供的解决方案来实现。其实hibernate的实现方式是通过中间表间接的实现了多对多关系,实际上也是将多对多拆分成两个双向的一对多关系。
多对多关系XML文件的配置
<hibernate-mapping>
<class name="Course" table="course">
 <set name="clazz" table="class_course" inverse="true"><!--设置中间表的表名-->
  <key column="courseid">
  <many-to-many column="classid" class="Clazz"/>
 </set>
</class>
</hibernate-mapping>

<hibernate-mapping>
<class name="Clazz" table="class">
 <set name="course" table="class_course" cascade="save-update">
  <key column="classid"/>
  <many-to-many  column="courseid" class="Course"/>
 </set>
</class>
</hibernate-mapping>

类继承关系映射

建表策略
所有类建一个表,只为具体类建表,每个类建一个表。

只为具体类建表,使用于不使用多态的情况下,具体类之间没有继承关系时适用
需要针对每个类写映射配置文件,就和普通的单表映射的xml文件相同。
也可以使用一个xml文件来进行映射,可以通过写union-subclass标签来表现其关系
这里不能使用id生成策略中的native,而是要指定特定的生成策略。

例:

<union-subclass name="notpad" table="tpcc_notpad">
     <property name="wight" column="wight" type="integer"/>
</union-subclass>
<union-subclass name="desktop" table="tpcc_desktop">
         <property name="LCD" column="isLCD" type="yes_no"/>
</union-subclass>

每个类建一个表,可以有效减少数据的冗余,减少字段,查询效率不很高。
正对每个类建一个表,只要写一个配置文件来进行类的映射即可
映射文件中的子类可以使用join-subclass标签来表示,并且引用父类的主键作为共享主键,就是不需要指定id生成策略
例:

<hibernate-mapping package="alan.hbn.rel.inherit" auto-import="false">

 <class name="Computer" table="tph_computer">
  
  <id name="comid" column="comid" type="long" unsaved-value="0">
   <generator class="identity"/>
  </id>
  <property name="price" column="price" type="integer"/>
  <joined-subclass name="notpad" table="tpc_notpad">
          <key column="comid" />
          <property name="wight" column="wight" type="integer"/>
  </joined-subclass>
       
  <joined-subclass name="Guest" table="tpc_guest">
              <key column="comid" />
              <property name="LCD" column="isLCD" type="yes_no"/>   
  </joined-subclass>
 </class>

</hibernate-mapping>


所有类只建一个表,查寻效率比较高,但是会产生很多空间浪费,当子类中的非空约束,就不大适用了,这是对于子类可以使用subclass标签表示。

<hibernate-mapping package="alan.hbn.rel.inherit" auto-import="false">

 <class name="Computer" table="tph_computer">
  
  <id name="id" column="id" type="long" unsaved-value="0">
   <generator class="identity"/>
  </id>
  
  <discriminator column="computer_type" type="integer"/>

  <property name="price" column="price" type="integer"/>

  <subclass name="Administrator" discriminator-value="ad">
              <property name="wight" column="wight" type="integer"/>
         </subclass>
       
         <subclass name="Guest" discriminator-value="gu">
               <property name="LCD" column="isLCD" type="yes_no"/>   
         </subclass>
 </class>

</hibernate-mapping>

不考虑多态时,最好是用只针对具体类建表,而考虑多态时尽量使用所有类建一个表,只有当子类中的属性过多是才考虑每个类建一个表的策略。 

Hibernate学习笔记(一)——简单的Hibernate实例入门

一、Hibernate简介 Hibernate是一个开源的对象/关系映射(ORM)框架,它对JDBC进行了轻量级的封装。所谓ORM就是Object/Relationship Mapping,为什么要...
  • u011024652
  • u011024652
  • 2016年09月19日 20:32
  • 854

Hibernate学习笔记之基础知识

Hibernate学习笔记
  • fanxiaobin577328725
  • fanxiaobin577328725
  • 2017年03月23日 17:07
  • 600

Hibernate自学详细笔记

Hibernate详细自学笔记,初学者快来看看吧!!!!
  • wangyang1354
  • wangyang1354
  • 2015年08月31日 21:23
  • 1244

Hibernate快速入门

Hibernate框架介绍什么是Hibernate我们可以从度娘上摘抄这样有关Hibernate的介绍: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017年03月20日 23:08
  • 1216

hibernate入门实例

一、准备工作 1,下载hibernate。地址:http://hibernate.org/orm/downloads/ 2,下载数据库驱动(以MySql为例)。地址:http://www.mysql....
  • passion_wu128
  • passion_wu128
  • 2015年11月30日 00:42
  • 3991

Hibernate框架笔记

Hibernate 课程内容: 1.   常见的O/R框架(了解) 2.   Hibernate基础配置(重点) 3.   ID生成策略(重点掌握auto) 4.   Hibernate ...
  • g_s007
  • g_s007
  • 2016年07月07日 15:39
  • 187

马士兵hibernate笔记

课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R Mapp...
  • l55iuming
  • l55iuming
  • 2015年10月17日 22:04
  • 983

《OpenCV3编程入门》学习笔记一:邂逅OpenCV

一:内容介绍本节主要介绍以下内容: 1. OpenCV3环境搭建 2. 快速上手尝试:图像显示、读取并播放视频、调用摄像头采集图像二:学习笔记1. 环境配置在OpenCV3中,项目架构发生了一些变...
  • NNNNNNNNNNNNY
  • NNNNNNNNNNNNY
  • 2016年09月14日 10:50
  • 4405

OpenCV学习笔记——《OpenCV3编程入门》读书笔记

这篇读书笔记,主要记录我阅读《OpenCV3编程入门》的读书笔记,作者毛星云写的这本书十分适合接触OpenCV的初学者,虽然理论性的内容是简要概括,但还是可以大致的理解。。此书最好的就是提供了大量的完...
  • lwq1026
  • lwq1026
  • 2016年12月05日 21:00
  • 2312

Python3 基础学习笔记

Python3 基础学习笔记这篇博客不是完整的python教程,只是我在学习python3时记下的一些容易忘记的或比较重要的知识点,里面的代码大多是转自 廖雪峰的python3教程 和 菜鸟教程 。不...
  • Cyiano
  • Cyiano
  • 2017年04月10日 19:58
  • 736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate入门笔记(3)
举报原因:
原因补充:

(最多只允许输入30个字)