7hibernate级联关系.docx
《7hibernate级联关系.docx》由会员分享,可在线阅读,更多相关《7hibernate级联关系.docx(11页珍藏版)》请在冰豆网上搜索。
7hibernate级联关系
Hibernate关联
一对一关联
1.一对一关联关系,共享主键方式
需要在“多”的一方(主动方)的持久化类中声明一个“一”方(被动方)类型的属性。
操作步骤:
登录表和详细信息表属于典型的一对一关联关系,可按共享主键方式进行。
步骤如下:
①创建Java项目,命名为“Hibernate_mapping”。
②添加Hibernate开发能力,步骤同4.2.1节第4步。
HibernateSessionFactory类同样位于org.util包下。
③编写生成数据库表对应的Java类对象和映射文件。
[反向生成]
4.持有类对象的修改。
重新生成get,set方法。
5.ORM映射文件修改
Login.hbm.xml
Detail.hbm.xml
6.新建Test.java
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Sessionsession=HibernateSessionFactory.getSession();
Transactionts=session.beginTransaction();//创建事务对象
Detaildetail=newDetail();
Loginlogin=newLogin();
login.setUsername("lupe2");
login.setPassword("123");
detail.setTruename("卢鹏");
detail.setEmail("yanhong@");
//相互设置关联
login.setDetail(detail);
detail.setLogin(login);
//这样完成后就可以通过Session对象调用session.save(detail)来持久化该对象
session.save(detail);
mit();
HibernateSessionFactory.closeSession();
}
}
7.运行测试结果:
2.一对一关联关系,唯一外键方式
(多对一的一种特殊情况)
步骤如下:
1.在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。
重新生成get,set方法。
2.Person.hbm.xml文件修改:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
column="room_id"//充当外键的字段名
class="org.model.Room"//被关联的类的名称
cascade="all"//主控类所有操作,对关联类也执行同样操作
unique="true"/>//唯一性约束,实现一对一
Room.hbm.xml:
3.编写测试代码。
在src文件夹下的包test的Test类中加入如下代码
3.多对一单向关联
【修改多(主控)的这边】
₪只要把上例中的一对一的唯一外键关联实例稍微修改就可以变成多对一。
【修改多(主控)的这边】步骤如下:
₪①在项目Hibernate_mapping的org.model包下编写生成数据库表对应的Java类对象和映射文件。
其对应表不变,Person表对应的类也不变,对应的Person.hbm.xml文件修改如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
column="room_id"//充当外键的字段名
class="org.model.Room"//被关联的类的名称
cascade="all"/>//主控类所有操作,对关联类也执行同样操作
而Room表不变,对应的POJO类如下:
2.运行测试,发现在room类在完全没有操作数据库的情况下,程序就完成了对数据的插入
总结:
多对一关联,在反向生成实体类和映射文件后,只需修改多(主控)的这一方实体类和映射文件就可进行数据的操作。
4.一对多双向关联
如上面在多对一关联的基础上。
修改一的这方数据(room的实体类和映射文件)
修改room的实体类文件
修改room的映射文件
invers表示关联关系的维护工作由谁来负责,默认false,表示由主控方负责;true表示由被控方负责。
由于该例是双向操作,故需要设为false,也可不写。
编写测试代码
…
Personperson1=newPerson();
Personperson2=newPerson();
Roomroom=newRoom();
room.setAddress("NJ-S1-328");
person1.setName("李方方");
person2.setName("王艳");
person1.setRoom(room);
person2.setRoom(room);
//这样完成后就可以通过Session对象
//调用session.save(person1)和session.save(person)
//会自动保存room
session.save(person1);
session.save(person2);
…