`
齐晓威_518
  • 浏览: 603900 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Hibernate开发需要知道的知识点

 
阅读更多

Hibernate开发需要知道的知识点

1.  Hibernate是如何延迟加载?

1.Hibernate2延迟加载实现:a)实体对象 b)集合(Collection
2. Hibernate3
提供了属性的延迟加载功能

Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

 

2.  Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-oneone-to-manymany-to-many

 

3Hibernate的查询方式
Sql
Criteria,object comptosition
Hql

1
、 属性查询

2
、 参数查询、命名参数查询

3
、 关联查询

4
、 分页查询

5
、 统计函数

 

4.如何优化Hibernate
1.
使用双向一对多关联,不使用单向一对多
2.
灵活使用单向一对多关联

3.
不用一对一,用多对一取代

4.
配置对象缓存,不使用集合缓存

5.
一对多集合使用Bag,多对多集合使用
Set
6.
继承类使用显式多态

7.
表字段要少,表关联不要怕多,有二级缓存撑腰

 

5Hibernate中关于get()和load()方法检索的区别

(1)get()方法和load()方法的区别在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到的情况下会直接查询数据库,不会去二级缓存中查找。在使用中,对使用了二级缓存的对象进行查询时最好使用load()方法,以充分利用二级缓存来提高检索的效率。

(2)get()在类检索级别时总是执行立即检索而且如果检索不到相关的对象的话会返回null,load()方法则会抛出一个ObjectNotException

(3)load()方法可返回一个实体代理类类型,而get()方法直接返回的是实体类对象。

 

6Hibernate中的update()saveOrUpdate()的区别

 

update()方法用来更新托管对象,对托管对象使用sava()方法是不对的,对临时对象使用update()方法也是不对的

saveOrupdate()方法兼具sava()update()方法的功能,而且托管对象和临时对象都可以使用

 

7hibernate对象有几种状态

Hibernate实体有三个状态:瞬时、持久化和脱管。

1)瞬时:一个实体通过new操作符创建后,没有和HibernateSession建立关系,也没有手动赋值过该实体的持久化标识(持久化标识可以认为映射表的主键)此时该实体中的任何属性的更新都不会反映到数据库表中。

2)持久化:当一个实体和HibernateSession创建了关系,并获取了持久化标识,而且在HibernateSession生命周期内存在,此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,也即与对应数据库保持同步。

 

8Hibernate级联关系总结


数据对象之间的关联关系有一对一,一对多及多对多三种。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。例如,当删除一个班级的信息时,还要删除该班级的所有学生的基本信息。如果直接使用JDBC执行这种级联操作,会非常繁锁。Hibernate通过把实体对象之间的关联关系及级联关系在映射文件中声明,比较简单地解决了这类级联操作问题。

1)、一对一关联关系的使用:


一对一关联关系在实际生活中是比较觉的,例如学生与学生证的关系,通过学生证可以找到学生。一对一关联关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联.

主键关联:
主键关联的重点是,关联两个实体共享一个主键值。例如studentcard是一对一关系,它们在数据库中对应的表分别是t_student t_card。它们共用一个主键值ID,这个主键可由t_studentt_card表生成。问题是如何让另一张表引用已经生成的主键值呢?例如,t_student表未老先衰了ID的值,t_card表如何引用它?这需要在Hibernate的映射文件中使用主键的foreign生成机制!

为了表示StudentCard之间的一对一的关联关系,我们需要在它们各自的映射文件中都要使用<one-to-one>标记!
一对一关系我在前面已经写过例子程序了,在这里仅给出两个映射文件。如下:
学生PO映射信息:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="hibernate.PO.TStudent" table="t_student" lazy="true"><!--
把类与表关联起来 -->
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="increment" />
</id>
<property name="userName" type="java.lang.String">
<column name="userName" length="20" />
</property>
<property name="cardId" type="java.lang.String">
<column name="card_id" length="20" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" length="2" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
<one-to-one name="card" class="hibernate.PO.TCard" fetch="join" cascade="all" />
</class>
</hibernate-mapping>
<!--
class
元素的lazy属性设定为true,表示延迟加载,如果lazy设为false,则
表示立即加载。以下对这二点进行说明。
立即加载:表示Hibernate在从数据库中取得数据组装好一个对象(如学生1)后,
会立即再从数据库取得数据组装此对象所关联的对象(如学生证1)
延迟加载:表示Hibernate在从数据库中取得数据组装好一个对象(如学生1)后,
不会立即再从数据库中取得数据组装此对象所关联的对象(如学生1)
而是等到需要时,才会从数据库取得数据组装此关联对象。
<one-to-one>
元素的cascade属性表明操作是否从父对象级联到被关联的对象,   
的取得可以是以下几种:
none
:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联
操作。它是默认值。
save-update
:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,
游离对象)
delete
:在删除当前对象时,级联删除附属对象。
all
:所有情况下均进行级联操作,即包含save-updatedelete操作。
delete-orphan
:删除和当前对象解除关系的附属对象。
<one-to-one>
元素的fetch属性的可选值是joinselect,默认是select
fetch属性设定为join时,表示连接抓取(Join fetching)Hibernate通过
Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合。
fetch属性设定为select时,表示查询抓取(Select fetching):需要另外发
送一条Select语句抓取当前对象的关联实体或集合。-->


学生证PO映射信息:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="hibernate.PO.TCard" table="t_card" lazy="true">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="foreign">
<param name="property">student</param>
</generator>
</id>
<!-- id
使用外键(foreign)生成机制,引用代号为student的对象
的主键作为T_card表的主键和外键。同时student在下面的
<one-to-one>
中进行了定义 -->
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>


<one-to-one name="student" class="hibernate.PO.TStudent" constrained="true" />       
<!-- constrained="true"
表示Card引用了student的主键作为外键。 -->
</class>
</hibernate-mapping>


外键关联:
外键关联的要点是:两个实体各自有不同的主键,但其中一个实体有一个外键引用另一个实体的主键。例如,假设,StudentCard是外键关联的一对一关系们在数据库中相应的表分别如下:t_student表有一个主键IDt_card表有一个主键ID和一个外键student_id,此外键对应 t_student表的主键ID,那么student的映射信息如上面一样不做改动,而Card的映射文件要做相应的改动。如下:
<hibernate-mapping>
<class name="hibernate.PO.TCard" table="t_card" lazy="true">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="increment"/><!--
不再是foreign -->                
</id>

<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>

<many-to-one name="student" column="student_id" class="hibernate.PO.TStudent" unique="true"/>
<!--
惟一的多对一,实际上变成一对一关系了 -->
<!-- unique
设为true表示使用DDL为外键字段生成一个惟一约束。
以外键关联对象的一对一关系,其本质上已经变成了一对多的双向关联,
应直接按照一对多和多对一的要求编写它们的映射文件。当unique
true
时实际上变成了一对一的关系。 -->

</class>
</hibernate-mapping>

2)、一对多关联关系的使用


一对多关系很觉,例如班级与学生的关系就是典型的一对多的关系。在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需要在一方进行映射配置,而双向的一对多需要在关联的双方进行映射配置。下面以Group(班级)Student(学生)为例讲解如何配置一对多的关系。
单向关联:
单向的一对多关系只需要在一方进行映射配置,所以我们只配置Group的映射文件:
<hibernate-mapping>
<class name="hibernate.PO.Group" table="t_group" lazy="true">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="increment"/>                
</id>
<!-- insert
属性表示被映射的字段是否出现在SQLINSERT语句中 -->
<property name="name" type="java.lang.String" update="true" insert="true">
<column name="name" length="20" />
</property>

<!-- set
元素描述的字段对应的类型为java.util.Set类型。
inverse
用于表示双向关联中的被动一端。inverse的值
false的一方负责维护关联关系。
sort
排序关系,其可选值为:unsorted(不排序)
natural(
自然排序)
comparatorClass(
由某个实现了java.util.comparator接口的类型指定排序算法。)
<key>
子元素的column属性指定关联表(t_student)的外键。
-->
<set name="students"
table="t_student"
lazy="true"
inverse="false"
cascade="all"
sort="unsorted">
<key column="ID"/>
<one-to-many class="hibernate.PO.TStudent"/>       
</set>
</class>
</hibernate-mapping>
双向关联:
如果要设置一对多双向关联关系,那么还需要在方的映射文件中使用<many-to-one>标记。例如,在GroupStudent一对多的双向关联中,除了Group的映射文件外还需要在Student的映射文件中加入如下代码:
<many-to-one name="group"
class="Group"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="ID" />

inert
update设定是否对column属性指定的关联字段进行insertupdate操作。
此外将Group.hbm.xml<set>元素的inverse设置为true.

 

3)、多对多关联关系的使用


Student(
学生)Course(课程)的关系就是多对多关系。在映射多对多关系时需要另外使用一个连接表(如Student_Course)。 Student_Course表包含二个字段:courseIDstudentID。此处它们的映射文件中使用<many-to- many>标记,在Student的映射文件中加入以下描述信息:
<set name="courses"
table="student_course"
lazy="false"
inverse="false"
cascade="save-update">
<key column="studentID" />
<many-to-many class="Course" column="CourseID"/>   
</set>
相应的Course的映射文件中加入以下:
<set name="students"
table="student_course"
lazy="false"
inverse="true"
cascade="save-update">
<key column="CourseID" />
<many-to-many class="Student" column="StudentID"/>   
</set>
添加关联关系:
首先编写一个程序来看看一个名为Bill的学生选择了什么课程:
//
获取代表BillStudent对象
Student stu = (Student)session.createQuery("from Student s where s.name='Bill'").uniqueResult();
List list = new ArrayList(stu.getCourses());
for(int i = 0 ; i < list.size(); i++)
{
Course course = (Course)list.get(i);//
取得Course对象
System.out.println(course.getName());//
打印出Bill所选课程的清单
}
现在Bill还想chemistry课程,这对于程序员来说只是为Bill添加一个到chemistry的关联,也就是说在student_course表中新增加一条记录,而T_studentT_Course表都不用变更。
//
获取代表BillStudent对象
Student stu = (Student)session.createQuery("from Student s where s.name='Bill'").uniqueResult();
Course course = (Course)session.createQuery("from Course c where c.name='chemistry'").uniqueResult();
//
设置stucourse的关联关系
stu.getCourses().add(course);
course.getStudents().add(stu);
删除关联关系:
删除关联关系比较简单,直接调用对象集合的remove()方法删除不要的对象就可。例如:要从学生Bill的选课清单中删除politicschemistry两门课,程序代码如下:
//
获取代表BillStudent对象
Student stu = (Student)session.createQuery("from Student s where s.name='Bill'").uniqueResult();
Course course1 = (Course)session.createQuery("from Course c where c.name='politics'").uniqueResult();
Course course2 = (Course)session.createQuery("from Course c where c.name='chemistry'").uniqueResult();
stu.getCourse().remove(course1);//
删除politics课程
stu.getCourse().remove(course2);//
删除chemistry课程
运行以上程序将从student_course表中删除这两条记录,但T_studentT_course表没有任何变化

 

分享到:
评论

相关推荐

    Hibernate知识文档 知识点笔记纪要

    Hibernate知识文档: 一、第一个hibernate项目 1、新建一个java项目 2、创建User Library,加入jar包 * HIBERNATE_HOME/lib/*.jar * HIBERNATE_HOME/lib/hibernate3.jar * MySql JDBC驱动 3、提供hibernate....

    Struts+Spring+Hibernate框架及应用开发源码

    本书使用的开发环境是JDK1.6+MyEclipse7,逐步引领读者从基础到各个知识点的学习。全书内容由浅入深,并提供了大量的实例说明。 本书提供了所有实例的源代码以及开发过程中用到的软件,供读者学习参考使用。 本书...

    struts hibernate spring 知识点

    java开发前后台技术,包含java struts hibernate spring html javascript等

    Hibernate4.1.1的Demo实例

    此demo包括了hibernate详细的知识点,开发环境是eclipse+jdk7

    Hibernate课件-------超全超详细的介绍hibernate

    本课程的讲解者李勇老师的技术功底非常深厚,课程内容组织得非常合理和巧妙,知识点的讲解也很细腻和透彻,总结了许多独有的经验,许多有经验的开发人员听完李勇老师的Hibernate课程后,都有一种恍然大悟的感慨。

    李勇老师_Hibernate视频教程(hibernate框架开发2016版视频及资料).rar

    本课程的讲解者李勇老师的技术功底非常深厚,课程内容组织得非常合理和巧妙,知识点的讲解也很细腻和透彻,总结了许多独有的经验,许多有经验的开发人员听完李勇老师的Hibernate课程后,都有一种恍然大悟的感慨。

    java面试知识点总结--Hibernate、ibates、strucs.pdf

    java面试知识点总结--Hibernate、ibates、strucs.pdf

    Hibernate技术手册

    该Hibernate手册比较详细的讲解了Hibernate在项目开发过程中提到的知识点

    java开发工程师面试中被经常问到知识点大全

    java开发工程师面试中被经常问到知识点大全,pdf文档,本文分为十九个模块,分别是∶ JavaSE基础、容器、多线程、反射、对象拷贝 Java Web相关的(servlet,JSP)、异常、网络、常见的23种设计模式 java的spring相关...

    Hibernate学习笔记

    该学习笔记总结了学习Hibernate的很重要知识点,包含在了项目开发中用到了大部分的内容!

    Hibernate实战(第2版 中文高清版)

     2.1.1 选择开发过程   2.1.2 建立项目   2.1.3 Hibernate配置和启动   2.1.4 运行和测试应用程序   2.2 启动Java Persistence项目   2.2.1 使用Hibernate Annotations   2.2.2 使用Hibernate ...

    深入浅出Hibernate

    当前与Hibernate开发有关的课程视频已经很多,这些课程在知识面上都有着一定的广度和深度,但在实际的公司培训与高校授课时,本人发现学习编程重要的是:学生从一开始就能写出可运行的程序,唯有如此才可激发学生...

    Java知识点大全(面试必备)

    Java基础 JAVA异常处理机制 集合 JDBC、MYSQL 线程 JavaWeb 框架----hibernate 框架----Struts2 框架----spring

    精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例全书

    本书较为全面地介绍J2EE Web应用开发的程序设计技术。书中介绍了相关的知识点,然后讲解网上购物子系统、公告管理系统、网上书店、BBS系统、信息发布平台、学生课程及成绩管理系统等8个实用的系统。

    从J2SE到J2EE知识点介绍

    (八) 复合自然主键实例(源代码hibernate_0500) 218 (九) Hibernate的类型 224 1. Java基本值类型的Hibernate映射 224 2. Java时间和日期类型的Hibernate映射类型 224 3. Java大对象类型的Hibernate映射类型 225 4....

    JavaWeb开发笔记.doc

    内容概要:一份JavaWeb开发笔记,注意,本资源是面向Web开发人员,需要有一些Web相关的知识,比如Http协议,JavaScript,JSP,CSS,前端框架,Web...目标:了解Web开发的全过程和知识点,流程,熟练掌握Web开发框架。

    JessMA Java Web 应用开发框架 (v3.2.2-20130815).pdf

    6) 平缓的学习曲线:学习使用JessMA只需掌握一定的Core Java与JSP/Servlet知识,本开发手册会循序渐进阐述每个知识点,每个知识点都会结合完整的示例进行讲述,知识点之间前后呼应,确保学习者在学习时温故知新,...

    JSP程序设计课件包含Hibernate,Struts的介绍

    答:需要掌握Java语言的知识要点。 8. Web程序的设计模式分为2种,单一JSP设计模式。MVC设计模式。 9. 单一JSP设计模式也称为Model 1(模式1)指应用JSP代码处理用户的请求,然后进行数据处理,再返回结果。优点:...

    Java综合技能知识库

    Java面向对象、Java基础类库、JDBC数据库访问、Web编程Jsp&Servlet、Hibernate持久层、iBatis持久层、Structs界面控制层、JSF界面控制层、Spring应用框架、Ejb、WebService技术、J2EE模式等其他Java相关开发技能汇总...

    Myeclipse全面详解

    本书是一本 MyEclipse 的精装教程,目前 Java 语言的编程工具中最流行的就 是 MyEclipse 集成开发工具。...通过本书的知识点,读者就可以全面了解使用 MyEclipse 工具进行 Java 项目开发中每一步骤的操作。

Global site tag (gtag.js) - Google Analytics