回顾:
一对多的集合里存的是持久对象,叫实体;不是值类型;String/Integer等
实体的特征是有自己的oid和映射文件;值类型是没有oid的,不能当成持久对象;一般作为持久对象的属性;
一, 集合映射: (用的很少)
Set是无序的,不能重复的;
Bag是介于Set和List之间的,java里没有,Hibernate模拟的, 它是无序的,但是允许重复的;
List是有序的,元素可以重复;
Map的key是不能重复的,value可以重复;
(1)set映射:
Person 类:name,age,gender,aliases(外号/别名)
<set name="aliases" table="t_aliases"> <!-- 只有集合本身的映射表 -->
<key column="fid"></key> <!--外号表引用person表的主键 -->
<element type="String" column="aliases"></element>
</set>
1,set是对集合本身的声明;table是集合元素(String类型)所存在的表;
既不是po的表,也不是多对多的关联表;在集合映射中,set属性即集合本身对应一个表;
2,fid,是set映射主表的主键上;
3,element,不是PO不是一对多,多对多关系;element没有表明任何的基数关系,而是集合关系;
4,type说明集合里的元素类型,column是元素在set映射表中的字段;
(2)bag映射: 在java里用 List 模拟(不保存下标);
Indexs类 --- Images
<idbag name="images" table="t_images">
<collection-id column="id" type="integer"><!-- 加了一个主键保证记录唯一 -->
<generator class="increment" />
</collection-id>
<key column="fid"></key> <!-- 外键也是可以重复的-->
<element type="String" column="image"></element> <!--集合里的元素是可以重复的 -->
</idbag>
(3)list映射:
Word类 --- descs ; 外键和list-index做联合主键;
<list name="descs" table="t_descs">
<key column="fid"></key> <!-- 外键可以重复-->
<list-index column="listIndex"></list-index> <!--下标也是可以重复的 -->
<element column="descri" type="string"> <!-- desc跟系统重名-->
</list>
(4)map映射:
Dictionary类 --- words map-key是key,element是value, (map.entry类型 key-value)
外键和map-key做联合主键;
<map name="words" table="t_words">
<key column="fid"></key>
<map-key column="word" type="string"></map-key>
<element column="descs" type="string"></element>
</map>
二, 组件映射:(用的很多)
组件也属于值类型的一种,是用户自定义的;
非PO;无oid,不需要单独写映射文件,资源利用很少;
实体映射(PO):基数映射和继承映射;
组件映射(非PO):寄居在实体中,细粒度,不需要单独持久化的对象;
1, 一对一的组件映射:
first-name, last-name 变成一个组件===> name
NamePair:就是一个组件;
可以使我们的代码更易读,更精细;
在映射时作为po的一部分,和po放到一个表里;
Account: aid,actNo,balance,owner, Address
把地址当成寄居在Account里;因为别的类也不用;
把Address的oid去掉;把一对一的关联关系,变成了组合关系;没有oid的非PO;
Account.hbn.xml
address属性的映射:
<component name="addr" class="Address">
<property name="postCode"></property>
<property name="city"></property>
<property name="street"></property>
</component>
能当组件看不当PO看,简单;
2, 一对多的组件映射:
集合映射和组件映射结合起来;
在Account中加上一个Address集合;
private Set addrs=new HashSet();
映射文件:
<set name="addrs" table="t_addrs">
<key column="fid" > <!-- 引用主表的主键作为外键 -->
<composite-element class="Address"> <!-- 集合里的元素是一个对象,不是普通的element-->
<property name="postCode"></property>
<property name="city"></property>
<property name="street"></property>
</composite-element>
</set>
注: Hibernate的配置文件里.同一个类只能有一个映射文件;
三, 获得session的方法:
hibernate 3.1 在SessionFactory 中提供了一个方法;
getCurrentSession() 获得当前线程的session;如果第一次调用,
会给你创建一个session;下次再用的话,直接得到这个session;
跟显示调用ThreadLocal不同的是,当事务一结束,即提交或回滚时,自动关闭session;
不需要显式关闭; 一事务一session;
Session s=(Session)sf.getCurrentSession();
tran.commit();//提交后再用session的话,还会再创建一个;开始的是一个新的事务;
// 保证的是一个事务一个session
Dao里不能提交(以方法为单位),放在Services里(以业务的原子操作为单位)提交;
应用事务开启--数据库事务开启---应用事务关闭(数据库事务关闭)
注:
在hibernate的配置文件里需要配置绑定在哪里?JPA(分布式事务管理器)或session;
<property name="current_session_context_class">thread</property>
四, 查询:
1, 有很多记录要查询时:
public static List findByNames(List l){
Session s=HbnUtil.getCurrentSession();
Transaction tran = null;
List result = null;
tran=s.beginTransaction();
Query q=s.createQuery("from Account a where a.owner in(:namelist)");
q.setParameterList("namelist", l );
result = q.list();
tran.commit();
return result;
}
2,属性查询
有时进行查询时不需要得到对象的所有属性,这时我们可以进行属性查询
Query query = session.createQuery(" select p.name from Person p " );
利用这种HQL语句查询出来的结果中,就只包含需要的指定的属性值
如果查询两个以上的属性值时,查询出来的结果会以数组的方式返回
Query query = session.createQuery(" select p.name , p.age from Person as p ");
List list = query.list();
for(int i=0; i<list.size(); i++){
Object obj[] = (Object[])list.get(i);
System.out.println("name===="+ obj[0]);
System.out.println("age ===="+ obj[1]);
}
3,实例化查询:
实例化查询其实是对属性查询的一种改进,示例如下:
Query query = session.createQuery(" select new Person(p.name , p.age) from Person p");
List list = query.list();
for(int i=0; i<list.size(); i++){
Person p = (Person)list.get(i);
System.out.println("name===="+ p.getName() );
System.out.println("age ===="+ p.getAge() );
}
4, 分页查询:
利用hibernate提供的setFirstResult()和setMaxResults()两个方法可以很好的定位
结果集中要查询记录的位置,是分页显示的一种较好的实现方案.
public static List readPage(int start , int num){
Session s=HbnUtil.getCurrentSession();
Transaction tran = null;
List result = null;
tran=s.beginTransaction();
Query query = session.createQuery(" from 实体类名 " );
query.setFirstResult(start); //设置查询记录开始行
query.setMaxResults(num); //设置查询的多少行记录
return query.list() ;
}
补充: rownum只能用<或<=; 可以用起别名的方式来达到目的;
--查询第1-5条记录
select * from (select rownum num, s_emp.* from s_emp)
where num >=1 and num <= 5;
--按工资排序,五条一页,查找第二页
select salary,first_name
from(
select s.*, rownum rm
from (select *
from s_emp
order by salary desc
) s
)
where rm between 6 and 10;
复习:
一, ORMapping:
ORM:持久化,怎样?
a.串行化(序列化):
b.关系型数据库:
关系: jdbc类:(30)代码量大,不好移植,易出错;
EJB Entity:(60)功能太强大了,部署比较复杂,也不适合;
Hibernate:(80)功能刚好,也不是很复杂,具有移植性;
xml文件, PO, 测试类;
持久化对象的确定;
xml文件的配置;
二, 基数映射:
1,一对一: day02
共享主键,其中一个主键还做外键; 两个<one-to-one>
引用外键, 一个<many-to-one>和一个<one-to-one>
普通属性用<property>
第一个特殊的属性就是<id>
另外关联属性用 <many-to-one>等表示;
<one-to-one>表示了一对一的对应关系;
2,一对多:day03
一的一方强的级联;多的一方弱的级联;cascade
inverse=true;交给多的一方去处理关系;
3, 多对多:day04
有一个中间表
三,继承映射:day04
四,组件映射:day05
五,状态:
session: 一级缓存;保持同步;
sessionFactory:二级缓存, 只读不写的话,可以把二级缓存打开,否则没用;
作业:
类图: User 1 ---- m Account --- Address(改成组件映射)
m / / \
1 权限 m Debit Check m
/ \
1 in-policy O-policy 1
(存款政策) 透支政策(一个透支政策可以给多个check使用)
Account:
<many-to-one>
<component>
<subclass>
关键是多练习.大概知道是怎么回事就行了.
只有写与不写的区别,没有会与不会的区别.
五万行代码;
明天讲html和javascript
分享到:
相关推荐
- 第五天可能涉及了高级主题,如性能优化、缓存机制、Cascading和Lazy Loading等。 通过这五天的复习,读者将能够全面了解Hibernate的工作原理,熟练掌握其配置、对象映射和查询操作,为实际项目开发中的数据持久...
本复习旨在深入理解Hibernate的核心概念、配置及常用API,帮助开发者提高开发效率。 一、Hibernate概述 Hibernate是Java领域中流行的ORM(Object-Relational Mapping)框架,它通过映射关系数据库与Java类,实现了...
**J2EE复习积累(六)-Hibernate4.2** 在J2EE开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了Java应用程序与数据库之间的交互。本篇复习将聚焦于Hibernate 4.2版本,该版本在前一版本的基础上...
9. **缓存机制**:为了提高性能,Hibernate引入了缓存,包括第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),以及第三方缓存插件如Ehcache。 10. **实体状态**:Hibernate定义了四种...
第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解不多,所以写出来的样式目前只在IE上运行良好,在...
- 这段代码中,两次调用`load()`方法获取同一个ID的Customer对象,由于是懒加载且使用了缓存,第二次调用不会再次查询数据库,而是返回同一个代理对象,所以输出结果是true,答案是C) 打印 true。 15. Hibernate...
【北大青鸟ACCP6.0 第三学期 Y2 JAVA方向 hibernate框架】是一个针对Java开发者的学习资源,主要聚焦于Hibernate这一流行的关系对象映射框架。Hibernate作为一个强大的ORM(Object-Relational Mapping)工具,它简化...
9. **配置连接池**:为优化数据库连接的管理,通常会结合Hibernate使用第三方连接池,如C3P0、HikariCP等。这样可以在多线程环境下高效复用数据库连接,提高系统性能。 通过学习这个"hibernate操作视频",你将能够...
"SVSE-S3冲刺题-Hibernate笔试题"这个标题表明这是一个针对SVSE(可能是软件版本、课程阶段或某个特定考试体系的缩写)第三阶段的冲刺复习资料,重点是Hibernate相关的笔试题目。Hibernate是一个开源的对象关系映射...
本课程资料旨在提供全面、深入的Hibernate学习资源,帮助初学者快速掌握ORM的核心概念,同时也为有经验的开发者提供复习和深化理解的机会。 一、Hibernate概述 Hibernate是一个强大的持久化框架,它简化了Java应用...
5. `org.hibernate.Configuration`: 负责配置并启动Hibernate,创建SessionFactory。 **第一个Hibernate例子** 这个例子展示了如何在开发环境中设置Hibernate,包括创建数据库、表,建立Java项目,导入相关库,编写...
第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 在Ajax更新复习次数时通常都会第一次失败,再点一次就能成功了,第一次...
第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解不多,所以写出来的样式目前只在IE上运行良好,在...
这些内容通常是计算机科学或信息技术专业第五学期(Semester 5)的学习重点。 【描述】中提到的"jsf,hibernate,spring,网络服务"是Java开发中的核心概念: 1. **JavaScriptFaces(JSF)**:JSF是一种Java ...
"考试复习第二部分,框架整合"这个主题,通常涵盖了多个Java Web开发框架的集成与协作,旨在提高项目开发效率,优化代码结构,并实现更高效的功能复用。在准备这样的考试或者学习过程中,以下是一些重要的知识点: ...
- 第 5 题,题目不完整,但通常与 Hibernate 中一对多关联的维护有关。 这些知识点涵盖了 Struts 2 框架的结构、配置和使用,Hibernate ORM 的核心概念及操作,以及 Java Web 开发中的基本设计模式。理解和掌握...
此外,还会讲解数据库设计的基本原则,如范式理论,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd范式)。 3. **SQL语言**:SQL(结构化查询语言)是用于管理和处理关系数据库的标准...
6. 成绩查询:考生可以查看自己的考试成绩及答题情况,便于自我评估和复习。 7. 数据分析:系统提供统计分析功能,帮助教师了解学生的学习情况,优化教学策略。 四、技术实现细节 1. 使用Struts的Action类处理...