Hibernate---我的Hibernate学习笔记(四)

2014-11-24 01:08:47 · 作者: · 浏览: 7
e提供的主要查询方法

1)Criteria Query(条件查询)的步骤:

(1)通过Session来创建条件查询对象Criteria

Criteria criteria = session.createCriteria(Course.class);

(2)构建条件---创建查询条件对象Criterion

Criterion criterion1 = Property.forName("id").ge(39);//通过Property来创建

Criterion criterion2 = Restrictions.le("cycle", 5); //通过Restrictions来创建

(3)查询对象关联条件

criteria.add(criterion1);

(4)执行条件查询

List courses = criteria.list();

2)HQL(Hibernate Qurey Language)

特点: 语法上与SQL类似; 完全面向对象的查询; 支持继承、多态、关联

(1) FROM子句

例如:查询所有的学生实例

Query query=session.createQuery("from Student");

query.list();

(2) SELECT子句

选择哪些对象和属性返回到结果集

A、SELECT语句后可以跟多个任意类型的属性,返回结果保存在Object类型的数组中

//A、B、C、都是查询学生的姓名和年龄

Query query=session.createQuery("select stu.name,stu.age from Student as stu");

List os=query.list();//返回的Object数组中有两个元素,第一个是姓名,第二个是年龄

B、SELECT语句后可以跟多个任意类型的属性,返回结果也可以保存在List中

Query query=session.createQuery ("select new List(stu.name,stu.age) from Student as stu");

List lists=query.list();

C、SELECT语句后可以跟多个任意类型的属性,返回结果也可以是一个类型安全的POJO对象

Query query=session.createQuery

("select new Student(stu.name,stu.age) from Student as stu");

List stuList=query.list();//注意:Student类必须有Student(String,int)的构造方法

D、SELECT子句中可以使用聚集函数、数学操作符、连接

支持的聚集函数:avg、sum、min、max、count ….

(3) WHERE子句,限制返回结果集的范围

(4) ORDER BY子句,对返回结果集进行排序

3)Native SQL(原生SQL查询)

可移植性差:资源层如果采用了不同的数据库产品,需要修改代码---非不得已,不推荐使用

步骤一:调用Session接口上的createSQLQuery(String sql)方法,返回SQLQuery

步骤二:在SQLQuery对象上调用addEntity(Class pojoClass) //设置查询返回的实体

例如:

SQLQuery query =session.createSQLQuery(“select * from student limit 2,10”)

query.addEntity(Student.class);

List stuList=query.list();

七、 Hibernate对象的状态

实体对象的三种状态:

1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关。

po在DB中无记录(无副本),po和session无关(手工管理同步)

如:

Customer customer = new Customer();

customer.setName("eric");

这里的customer对象与数据库中的数据没有任何关联

2) 持久态(Persistent)---实体对象处于Hibernate框架的管理中。

po在DB中有记录,和session有关(session自动管理同步)

3)游离态(脱管态)(Detached)

处于Persistent状态的实体对象,其对应的Session实例关闭之后,那么,此对象处于Detached状态。

po在DB中有记录,和session无关(手工管理同步)

无名态:po处于游离态时被垃圾回收了。没有正本,只有DB中的副本。

po处于暂态时被垃圾回收了,则死亡。(唯一可以死亡的状态)

实质上,这三个状态是:持久对象的正副本与同步的关系

原则:尽量使用持久态。

三态的转换:

暂态--->持久态

A.调用Session接口上的get()、load()方法

B.调用Session接口上的save()、saveOrUpdate()方法

持久态--->暂态

delete();

游离态--->持久态

update()、saveOrUpdate()、lock();

(lock不建议用,危险;肯定没变化时用,有则用updata)

持久态--->游离态

evict()、close()、clear()

(一般用evict,只关闭一个实体的连接;close关闭整个连接,动作太大)

八、 映射(重点掌握和理解,注意配置的细节)

关联关系:A有可能使用B,则AB之间有关联关系(Java里指A有B的引用)。

双边关系、传递性、方向性、名称、角色(权限)、数量(1:1;1:m;n:m)、关联强度

委托:整体跟部分之间是同一类型。

代理:整体跟部分之间不是同一类型。

A. 单一实体映射:最简单、基本映射(最重要);任何其他映射种类的基础。

原则:

1.类->表;一个类对应一个表。

2.属性->字段:普通属性、Oid;一个属性对应一个字段。

B. 实体关系映射:

a.关联关系映射:(最难、量最多)

1.基数关系映射:

一对一(one to one) (共享主键、唯一外键)

一对多(one to many) (1:m) 作级联,删one后连着删many

多对一(many to one) (m:1) 不作级联,删many中一个,不删one

多对多(many to many)(n:m = 1:n + m:1)

2.组件关系映射:(一个类作为另一个类的零件,从属于另一个类,没有自己的XML)

单一组件关系映射

集合组件关系映射

b.继承关系映射:(最普遍。两个类有继承关系,在本质上他们就是一对一关系。共享主健。)

有三种映射方案:

1.一个类一个表(效率很低;最后考虑使用,一般是数据量较大和父子类重复字段不多的时候用)

只有当子类中的属性过多时才考虑每个类建一个表的策略。

2.一个实体一个表(多表查询效率低,不考虑多态时用)

不考虑多态时,最好是用只针对具体类建表,而考虑多态时尽量使用所有类建一个表

3.所有类一个表(查询效率最高,结构简单;字段数不超过100个时使用,首选)

c.集合映射(值类型)

Set 不重复、无顺序

List 可重复、有顺序

Map

Bag 可重复、无顺序(bag本身也是list实现的)

双向关联(Bidirectional associations)(相当于两个单向关联)

单向关联(Unidirectional associations)

"一"方的配置: