Hibernate表的映射.docx
《Hibernate表的映射.docx》由会员分享,可在线阅读,更多相关《Hibernate表的映射.docx(66页珍藏版)》请在冰豆网上搜索。
Hibernate表的映射
Hibernate各种映射处理
Hibernate各种映射处理1
1.一对多(多对一)的关联3
(1)多对一(单项关联)3
(2).一对多(单项关联)7
(3).一对多、多对一双向关联10
2..一对一关联16
(1)一对一单项关联16
(2)一对一双向关联19
3..多对多关联24
(1)中间表不映射(即三个表两个配置文件)24
(2)多对多(三个表,中间表参与映射,且有主键,三个映射文件)31
4、继承映射38
(1)三个表通过外键关联39
(2)两个表(只有两个表,两个映射文件,三个类)44
(3)一个表的做法(建立的表需要有一个标字位)48
注意cascade、fetch、lazy、inverse的用法
fetch和inverse主要用在select中,cascade和inverse用在updatedeleteinsert/save
(1)cascadecascade的值可以为noneallsave-update几种,默认为none,一般用于有insertupdatedelete.的程序中。
(2)fetchfetch一般的值为select,可有可无,设置查询数据的方式
(3)lazylazy的值为true或false,true代表查询父表顺便把子表也查询,false代表查询父表,子表在需要读取时才select,一般设置为false,能够提高项目的效率。
(4)inverse控制反转,一般用于双向关联,在非多对多的映射中,inverse=true,设置主控方为多的一方,默认为false,此时一般需要设置级联cascade.一般用于有insertupdatedelete的程序中。
================================================数据库表
createdatabasehibernatesql;
usehibernatesql;
createtableuser(
idintauto_incrementprimarykey,
usernamevarchar(15)notnull,
passwordvarchar(15)notnull
)engine=InnoDBdefaultcharset=GBK;
-----
createtablestudent(
idintauto_incrementprimarykey,
namevarchar(12)notnull,
agevarchar(12)notnull
)engine=InnoDBdefaultcharset=GBK;
----------
createtablepassenger(
idintauto_incrementprimarykey,
namevarchar(15),
emailvarchar(15),
telvarchar(15)
)engine=InnoDBdefaultcharset=GBK;
------------------
createtableemployee(
idintauto_incrementprimarykey,
namevarchar(20),
iconblob
)engine=InnoDBdefaultcharset=GBK;
---主键为uuid形式
createtableautoid(
idintprimarykey,
namevarchar(23)
)engine=InnoDBdefaultcharset=GBK;
--复合主键
createtabledoublekey(
numvarchar(32),
namevarchar(15),
primarykey(num,name)
)engine=InnoDBdefaultcharset=GBK;
--assigned形式主键
createtableapptable(
numnamevarchar(25)primarykey,
usermessagevarchar(20)
)engine=InnoDBdefaultcharset=GBK;
--blob类型图片的添加
createtableblobphoto(
idintauto_incrementprimarykey,
smailevarchar(25),
imageblob
)engine=InnoDBdefaultcharset=GBK;
--onetomany
--room
createtableroom(
idintauto_incrementprimarykey,
namevarchar(25),
addressvarchar(25)
)engine=InnoDBdefaultcharset=GBK;
--emp
createtableemp(
idintauto_incrementprimarykey,
namevarchar(20),
messagevarchar(20),
ridint,
keyFK_emp_room(rid),
constraintFK_emp_roomforeignkey(rid)referencesroom(id)
)engine=InnoDBdefaultcharset=GBK;
1.一对多(多对一)的关联
(1)多对一(单项关联)
packageutil;
publicclassRoom1{
privateIntegerid;
privateStringname;
privateStringaddress;
publicRoom1(){
}
publicRoom1(Stringname,Stringaddress){
this.name=name;
this.address=address;
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
=============================================
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"
=============================
packageutil;
publicclassEmp1{
privateIntegerid;
privateStringname;
privateStringmessage;
privateRoom1room1;
publicEmp1(){
}
publicEmp1(Stringname,Stringmessage,Room1room1){
this.name=name;
this.message=message;
this.room1=room1;
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetMessage(){
returnmessage;
}
publicvoidsetMessage(Stringmessage){
this.message=message;
}
publicRoom1getRoom1(){
returnroom1;
}
publicvoidsetRoom1(Room1room1){
this.room1=room1;
}
}
======================================
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--注意单项关联只需要在一方进行配置关系-->
update">
--注意一般外键允许为空-->
==================================
SignalManytoOne.java
packagedeal;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importutil.Emp1;
importutil.HibernateSessionFactory;
importutil.Room1;
publicclassSignalManytoOne{
privatestaticSessionsession;
privatestaticTransactionts;
publicstaticvoidmain(String[]args){
//应先插入父表
Room1r1=newRoom1("as","yyyyy");
Emp1em1=newEmp1("ae1","mm1",r1);
Emp1em2=newEmp1("ae2","mm1",r1);
Emp1em3=newEmp1("ae3","mm1",r1);
Emp1em4=newEmp1("ae4","mm1",r1);
Emp1em5=newEmp1("ae5","mm1",r1);
saveEmp(em1);
saveEmp(em2);
saveEmp(em3);
saveEmp(em4);
saveEmp(em5);
}
publicstaticvoidsaveEmp(Emp1em1){
//TODOAuto-generatedmethodstub
session=HibernateSessionFactory.getSession();
ts=session.beginTransaction();
session.save(em1);
mit();
session.close();
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
(2).一对多(单项关联)
packageutil;
publicclassEmp2{
privateIntegerid;
privateStringname;
privateStringmessage;
publicEmp2(){
}
publicEmp2(Stringname,Stringmessage){
this.name=name;
this.message=message;
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetMessage(){
returnmessage;
}
publicvoidsetMessage(Stringmessage){
this.message=message;
}
}
-------------Emp2.hbm.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
-------------------------------------------------------
packageutil;
importjava.util.HashSet;
importjava.util.Set;
publicclassRoom2{
privateIntegerid;
privateStringname;
privateStringaddress;
privateSetemps=newHashSet();
publicRoom2(){
}
publicRoom2(Stringname,Stringaddress,Setemps){
this.name=name;
this.address=address;
this.emps=emps;
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
publicSetgetEmps(){
returnemps;
}
publicvoidsetEmps(Setemps){
this.emps=emps;
}
}
-------------------------Room2.hbm.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--外键可以为空,not-null="true"最好不要限制,
Rid是emp表中,注意外键不唯一-->
-------------------------------
SignalOntToMany.java
packagedeal;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importutil.Emp2;
importutil.HibernateSessionFactory;
importutil.Room2;
publicclassSignalOneToMany{
privatestaticSessionsession;
privatestaticTransactionts;
publicstaticvoidmain(String[]args){
//应先插入父表
Room2r2=newRoom2();
r2.setName("liu");
r2.setAddress("beijing");
//对于是集合的插入方法
r2.getEmps().add(newEmp2("kk1","helo"));
r2.getEmps().add(newEmp2("kk2","helo"));
r2.getEmps().add(newEmp2("kk3","helo"));
saveSignalOneToMany(r2);
}
publicstaticvoidsaveSignalOneToMany(Room2r2){
//TODOAuto-generatedmethodstub
session=HibernateSessionFactory.getSession();
ts=session.beginTransaction();
session.save(r2);
mit();
session.close();
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>