贯通HIBERNATE开发读书笔记Word格式.docx
- 文档编号:18983782
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:45
- 大小:58.29KB
贯通HIBERNATE开发读书笔记Word格式.docx
《贯通HIBERNATE开发读书笔记Word格式.docx》由会员分享,可在线阅读,更多相关《贯通HIBERNATE开发读书笔记Word格式.docx(45页珍藏版)》请在冰豆网上搜索。
Lesson(Lno,TNo,LName)
//Lno是主键TNo是Teacher表的外键
使用连接表的情况
Teacher(TNo,TName,TTel)
Lesson(Lno,LHour)
TeacherLesson(TNo,LNo)
//建立一个关联的第三方表
2.单向关联和双向关联
根据是否存在关联关系所链接的双方都能导航到对方,将关联关系分为单向关联和双向关联两种类型。
单向关联只能从相互关联的一方导航到另一方。
双向关联可以从相互关联的任意一方导航到另一方。
如教师和课程之间的关联。
单向关联中,仅在课程类这一方声明了讲授该课程的所有教师的集合。
双向关联中,在教师和课程双方都对与之关联的课程列表与教师列表进行了声明
《贯通HIBERNATE开发》的读书笔记-关联关系映射2
单向多对一关联
在关系型数据库理论中,“多对一”关联同于“一对多”关联,且为了消除数据冗余,在两个关系之间不存在“多对多”关联,“多对多”关联要通过连接表来实现。
因此在关系型数据库中只有“一对一”和“一对多(多对一)”,且都是单向的。
而在hibernate当中,为了保证关联双方的映射可以通过多种方式进行,“单向一对多”关联和“单向多对一”被认为是两种不同的关联,其主要区别是在于哪个表的映射文件中进行<
manytoone>
的配置,进行<
配置的一方便是“多”。
由于“单向一对多”关联的应用比较少见并不被hibernate推荐使用,下面仅对"
单向多对一"
关联进行说明
对于<
中,主要属性说明如下
name(必需):
设定“many”方所包含的“one”方所对应的持久化类的属性名
column(可选):
设定one方的主键,即持久化类的属性对应的表的外键
class(可选):
设定one方对应的持久化类的名称,即持久化类属性的类型
not-null(可选):
如果为true,,表示需要建立相互关联的两个表之间的外键约束
cascade(可选):
级联操作选项,默认为none
单向多对一(manytoone)关联是最常见的单向关联关系。
假设多个人(Person)可以有一个住址(Address),我们只关心人实体找到对应的地址实体,而无须关心从某个地址找到全部用户.
下面是将Person.hbm.xml和Address.hbm.xml文件合并到一个Chapter801.hbm.xml文件
Chapter801.hbm.xml映射文件
<
hibernate-mapping>
class
name="
hibernate.wizard.chapter8.Person"
table="
C8_Person"
schema="
dbo"
>
<
id
personId"
type="
java.lang.String"
column="
>
generatorclass="
assigned"
/>
/id>
!
--Associations-->
many-to-onename="
Address"
addressId"
class="
hibernate.wizard.chapter8.Address"
not-null="
true"
cascade="
none"
/class>
C8_Address"
property
addressName"
false"
length="
50"
/property>
/hibernate-mapping>
持久化类
Person.hbm.xml文件定义了一个<
的关联,而Address.hbm.xml文件未定义的任何关联,说明可以从Person类单向关联到Address类。
由于Person类与Address类是“多对一”的关系。
因此需要在Person类中声明一个Address类型的地属性address,以实现从一个Person对象导航到与之相关联的Address对象的目的。
为了使Person对象与Address对象关联,还需要为Person类构造一人带有Address类型的参数的构造函数
Person类
publicclassPersonimplementsSerializable{
privateStringpersonId;
privateStringaddressId;
privateAddressaddress;
//声明了Address类型的属性
publicPerson(StringpersonId,StringaddressId){
this.personId=personId;
this.addressId=addressId;
}
publicPerson(StringpersonId,Addressaddress){
this.personId=personId;
this.addressId=address.getAddressId();
this.address=address;
publicPerson(StringpersonId){
publicPerson(){
publicStringgetPersonId(){
returnthis.personId;
publicvoidsetPersonId(StringpersonId){
publicStringgetAddressId(){
returnthis.addressId;
publicvoidsetAddressId(StringaddressId){
publicStringtoString(){
returnnewToStringBuilder(this)
.append("
getPersonId())
.toString();
publicAddressgetAddress(){
returnaddress;
}
publicvoidsetAddress(Addressaddress){
this.address=address;
Address类
publicclassAddressimplementsSerializable{
privateStringaddressName;
//
privateSetpeople=newHashSet();
//双向一对多关联时才用
publicAddress(StringaddressId,StringaddressName){
this.addressName=addressName;
publicAddress(){
getAddressId())
publicStringgetAddressName(){
returnaddressName;
publicvoidsetAddressName(StringaddressName){
this.addressName=addressName;
publicSetgetPeople(){
returnpeople;
publicvoidsetPeople(Setpeople){
this.people=people;
单向多对一关联测试
publicclassManyToOneTest{
Sessionsession;
Transactiontx;
publicstaticvoidmain(String[]args){
ManyToOneTestutil=newManyToOneTest();
util.insert();
publicvoidinsert(){
try{
session=HibernateUtil.getSession();
}catch(HibernateExceptionex){
System.out.println(ex);
tx=session.beginTransaction();
//开始事务
//无级联更新
//保存Address
Addressaddr=newAddress("
0001"
"
云山路"
);
//addr是临时对象
session.save(addr);
//addr已变成持久化对象
session.flush();
//刷新缓存,将数据提交
System.out.println("
成功保存Address..."
//保存Person,与上一个Address关联
Personp1=newPerson("
00001"
addr);
Personp2=newPerson("
00002"
session.save(p1);
session.save(p2);
//加下面语句,下面的打印语句就不会出现在insert语句的前面了
成功保存Person..."
ArrayListresult=(ArrayList)session.createQuery("
fromhibernate.wizard.chapter8.Personasp"
+
"
wherep.personId='
00001'
).list();
for(inti=0;
i<
result.size();
i++){
Personp=(Person)result.get(i);
---personId---addressId---addressName"
---"
+p.getPersonId()+"
+p.getAddressId()+"
+p.getAddress().getAddressName());
mit();
//提交事务
session.close();
//关闭session
运行结果
初始化SessionFactory成功。
Hibernate:
insertintodbo.C8_Address(addressName,addressId)values(?
?
)
成功保存Address...
insertintodbo.C8_Person(addressId,personId)values(?
成功保存Person...
selectperson0_.personIdaspersonId2_,person0_.addressIdasaddressId2_fromdbo.C8_Personperson0_whereperson0_.personId='
---personId---addressId---addressName
---00001---0001---云山路
建立单向多对一关联需要注意以下几点问题
1.在many方的映射文件中,使用<
标识进行关联映射的定义
2.many方的持久化类中必须声明one方对应的持久化类的属性,用于实现多对一的导航,如上例中的privateAddressaddress;
3.应用程序中必须创建many方到one方的关联,示例中使用带有one方对应的持久化类的参数类型的构造函数是一种方式,另外也可以直接使用many方的set方法创建关联,如pl.setAddress(addr)
4.级联操作定义在<
操作中,如果将cascade属性设为all或save-update,那么在应用程序中只需要用Session的sava方法持久化many方的对象即可,如session.save(p3)
《贯通HIBERNATE开发》的读书笔记-关联关系映射3
双向多对一关联
双向多对一"
或“双向一对多”关联是一种最常见的关联关系,由于建立双向联系,无论是“many”方还是“one”方,都可以通过相关的属性导航到对方,因此本节仅对“双向多对一”关联进行介绍
(多对人具有一个相同的地址)
映射文件
hibernate使用<
和<
set>
标记在映射文件中定义双向多对一关联。
--利用set集合映射实现一对多关联-->
setname="
people"
inverse="
all"
keycolumn="
/>
one-to-manyclass="
/set>
说明:
“双向多对一”关联与上一节中的“单向多对一”关联在映射文件方面的主要区别仅仅在于:
在one方增加了一个“一对多”的映射,该映射使用<
onetomany>
标记进行定义
相应地,为了实现双向关联,必须在one方的持久化类中添加对于many方的声明。
Person类的实现与“单向多对一”关联中相同
this.addressId=address.getAddressId();
this.address=address;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贯通 HIBERNATE 开发 读书笔记