回顾:
PO的状态;
cascade级联操作
事务控制
一, 多对多
Student 中有一个course的set 集合; Course中有一个Student的set 集合;
数据库中没有办法直接表示多对多;
必须有一个中间表;
t_student s_c t_course
sid fsid fcid cid
s1 s1 c1 c1
s2 s1 c2 c2
s3 s2 c1 c3
s3 c3
多对多表:
create table t_student(
sid number(11) primary key,
name varchar(15) not null,
stuId varchar(30) unique not null
);
create table t_course(
cid number(11) primary key,
name varchar(20) not null,
courseId varchar(30) unique not null
);
create table t_enrollment(
fsid number(11) references t_student(sid),
fcid number(11) references t_course(cid),
constraint many2many_534oijhsd34
primary key(fsid,fcid)
);
xml配置文件:
Student.xml
<class name="Student" table="T_STUDENT">
<id name="sid" column="sid">
<generator class="native" />
</id>
<property name="name" />
<property name="stuId" />
<set name="courses" table="s_c" cascade="save-update" inverse="true"><!--inverse="true" 写在一端就行了 -->
<key column="fsid" /> <!--关系的另一方的表中与本表关联的外键字段; -->
<many-to-many class="Course" column="fcid" /> <!-- Course表在中间表对应的外键字段-->
</set>
</class>
多对多的set与一对多的set的意思不一样;这里映射的是中间表;
属性的映射;
name="courses" 对应的是一个表, 不是一个字段;
key 表示关系的另一方(关联表)的外键; column="fsid" 是Student表在关联表中的外键,
表示了一个一对多关系;
class 是集合里元素的类型是Course; 多对多的关系, column="fcid"是Course表在关联表中外键,
表示了另外一个一对多;
PO的角度;<many-to-many> 说明了多对多的关系;
在设计的时候有可能将多对多关系变成一对多的关系;
加一个选课类即可;学生和选课对象变成一对多的关系;
一个选课对象只能对一个学生;一个学生对应多个选课对象;
Course.xml
<class name="Course" table="T_COURSE">
<id name="cid" column="cid">
<generator class="native" />
</id>
<property name="name" />
<property name="courseId" />
<set name="students" table="s_c" cascade="save-update" >
<key column="fcid" />
<many-to-many class="Student" column="fsid" />
</set>
</class>
二, 查询:
传过来的搞不清楚是游离态还是暂态就用saveOrUpdate();
Smalltalk 语言的语法; a 对象调用一个x方法返回a对象, 继续调用y 方法仍返回a 对象;
返回void时也返回自己;
s=(Student)session.createQuery("from Student s where stuID =: stuID")
.setString("stuID",stuID)
.uniqueResult();
其他查询:
"from Student s where stuName like :stuName"
连接表查询:面向对象的写法:
"select s.name,c.name from Student s join s.courses c"
内连接:
是保证两个表中所有的行都要满足连接条件;
并不是所有的学生都有选课记录;
外连接:
会使用一方表中的所有记录去和另一表中的记录按条件匹配
左右外连接 只是一种形式:与 (+) 本质上是一样的:
Left Outer Join 包含了左表中的全部行(表达式中第一个表)
Right Outer Join 包括了右表中的全部行(表达式中第二个表)
也就是说在oracle中+号放在=右边相当于左连接,而+号放在=左边相当于右连接
就地加工成 component (组件) NamePair : 细粒度对象;
用作报表;
对两个实体进行join操作;每一个学生选的所有课;
"select new com.NamePair(s.name, c.name)from Student s join s.courses c"
用的时候才加载; 延迟加载;集合里的对象只是代理;session关闭就不行了;
dao里写session不好;
三, 继承映射:
1, 每个类建一个表
特点:
最接近于面向对象的结构;
查询效率低,任何一个查询都要连接表;不利于做报表;
在类比较多的情况下用这个;
2, 只有具体类才建表
特点:
查询效率也不是很高;
对多态支持不好;
3, 所有类对应一张表 (这种用的最多)
特点:
结构简单,就一个表,查询效率高,做报表也很方便;
表太大,不太好维护,做索引不好做;子类的字段可以为空的;
映射关系:
Account:
DebitAccount: 站在银行的角度,银行是借方; courrency
CheckAccount: 客户可以透支,银行是贷方; overdraft
3- 所有类一共一张表 -perhiarchy: 表里多了一个type字段;
<discriminator column="type" /> <!-- 区分字段,写在id后面,version前面; -->
<subclass name="DebitAccount" discriminator-value="D区分字段名">
<property name="currency" />
</subclass>
模拟建表:
create table t_account(
aid number(15) primary key,
... //父类和子类的所有字段
type varchar(20) not null
);
1- 一个类一个表-
子表主键引用父表;
<joined-subclass name="DebitAccount" table="t_DebitAccount">
<property name="currency" />
<key column="dfid" /> <!-- key的作用就是外键,子表引用父表的主键-->
</joined-subclass>
模拟建表:
create table t_account(
aid number(11) primary key,
...//父类的所有字段
);
create table t_debitaccount(
dfid number(11) primary key
references t_account(aid),
...//子类的字段
);
create table t_checkaccount(
cfid number(11) primary key
references t_account(aid),
...//子类的字段
);
左外连接实现多态;
2- 具体类对应表,父类没有表 -
子类表中包含父类的字段和自己的字段;
字段定义上有冗余,数据本身没有冗余;
两个表之间没有关系; 单独写两个映射文件也是可以的;
配置父类的属性;//两个表公用这些字段;名称相同;
<union-subclass name="DerbitAccount" table="t_account_derbit">
<property name="currency">
</union-subclass>
模拟建表:
create table t_account_derbit(
aid number(11) primary key,
...//父类的属性
currency varchar(10) not null
...//子类的属性
);
create table t_account_check(
pid number(11) primary key,
...//父类的属性
...//子类的属性
);
多态怎么完成的:做了三个子查询;很复杂;效率低;
映射关系原则:
1) 不要求多态查询的话可以用一个具体类一个表;
2) 要求多态查询的话,并且类少并且属性少用一个表;
3) 要求多态类多并且大用一个类一个表;
一般都采取第二种;
关联属性定义在父类比较好;配置时写在父类里;
组件映射和集合映射明天讲;
四, session的安全性:
把session作为参数时, 有可能在一个dao中用到了不同的session;这样很不安全;
所以考虑和线程绑定,一个线程只用一个session;就能保证一系列的连续的任务用的是一个session;
有一个绑定session和线程的工具:
java.lang.ThreadLocal 是一个类; jdk1.2就有了;
原理:
内部打开了一个Map; key是线程对象, value是session对象;
t1 object1
t2 session1
在t1线程里调用:TL.get();==>返回t1线程对应的object1;
在t2线程里调用:TL.set(s1);==>设置t2线程的value为session1;
在HbnUtil里维护一个静态的属性:
private static final ThreadLocal threadLocal=new ThreadLocal();
//一个线程一个session;
public static Session getCurrentSession(){
Session s=(Session)threadLocal.get();//得到当前线程的session
if(s==null){//如果为空,就打开一个session,并和当前线程关联起来;
s=sf.openSession();
threadLocal.set(s);
}
return s;
}
//释放session;
public static void close(){
Session s=(Session)threadLocal.get();
if(s!=null && s.isopen()){//
s.close(); //关闭当前线程的session
}
threadLocal.set(null);//和当前线程解除关联;
}
将dao中的属性session和 setSession()方法去掉;通过工具类得到当前线程的session;
当有一系列操作时, 用了几次session,保证是同一个session才能和数据库同步;
分享到:
相关推荐
- 第四天可能讲解了HQL的使用,包括查询、更新、删除等操作。 - 第五天可能涉及了高级主题,如性能优化、缓存机制、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定义了四种...
第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解不多,所以写出来的样式目前只在IE...
- 有四种主要检索方式:HQL(Hibernate查询语言)、Criteria API、Query API(基于JPA的查询)、Native SQL。 12. 对象何时变为游离状态: - 在Hibernate中,当Session关闭时,所有与之关联的持久化对象变为游离...
【北大青鸟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应用...
4. `org.hibernate.Query`: 执行各种数据库查询,支持HQL语言和SQL语句。 5. `org.hibernate.Configuration`: 负责配置并启动Hibernate,创建SessionFactory。 **第一个Hibernate例子** 这个例子展示了如何在开发...
第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 在Ajax更新复习次数时通常都会第一次失败,再点一次就...
第四次:12小时 第五次:24小时 第六次:3 天 第七次:7 天 之后 :每15天 当然如果没有及时更新复习的话,下一次的复习更新时间会在上一次复习更新后顺延。 由于对页面样式了解不多,所以写出来的样式目前只在IE...
"考试复习第二部分,框架整合"这个主题,通常涵盖了多个Java Web开发框架的集成与协作,旨在提高项目开发效率,优化代码结构,并实现更高效的功能复用。在准备这样的考试或者学习过程中,以下是一些重要的知识点: ...
SSH 期末复习题涉及到的主要知识点包括 Struts 2 框架、Hibernate ORM 和 Java Web 开发中的核心概念。以下是对这些知识点的详细说明: 1. **Struts 2**: - **基础类库**:构建 Struts 2 应用的基础类库包括 `...
此外,还会讲解数据库设计的基本原则,如范式理论,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd范式)。 3. **SQL语言**:SQL(结构化查询语言)是用于管理和处理关系数据库的标准...
【标题】"Sem5_复习题.zip"是一个包含与信息技术相关的复习材料的压缩文件,它涵盖了JavaScriptFaces(JSF)、Hibernate、Spring框架以及网络服务等多个关键主题。这些内容通常是计算机科学或信息技术专业第五学期...