hibernate映射关系关联查询.docx
《hibernate映射关系关联查询.docx》由会员分享,可在线阅读,更多相关《hibernate映射关系关联查询.docx(83页珍藏版)》请在冰豆网上搜索。
![hibernate映射关系关联查询.docx](https://file1.bdocx.com/fileroot1/2023-1/7/7cee22b0-004f-4fe8-b39a-ca6e746dbd4b/7cee22b0-004f-4fe8-b39a-ca6e746dbd4b1.gif)
hibernate映射关系关联查询
Hibernate关联关系映射目录
│
A单向关联
│├─一对一外键单向关联
│├─一对一主键单向关联
│├─一对一连接表单向关联
│├─一对多外键单向关联
│├─一对多连接表单向关联
│├─多对一外键单向关联
│├─多对一连接表单向关联
│└─多对多单向关联
B双向关联
├─一对一外键双向关联
├─一对一主键双向关联
├─一对一连接表双向关联
├─一对多外键双向关联
├─一对多连接表双向关联
└─多对多双向关联
Hibernate一对一外键单向关联
2007-08-2213:
17:
58
标签:
Hibernate一对一 [推送到技术圈]
版权声明:
原创作品,如需转载,请与作者联系。
否则将追究法律责任。
st1\:
*{behavior:
url(#ieooui)}
Hibernate一对一外键单向关联
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。
只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。
基于外键的单向1-1的配置将与无连接表N-1关联的many-to-one增加unique="true"属性即可。
一、模型介绍
一个人(Person)对应一个地址(Address)。
二、实体(省略getter、setter方法)
publicclassPerson11fk{
privateintpersonid;
privateStringname;
privateintage;
privateAddress11fkaddress11fk;
publicclassAddress11fk{
privateintaddressid;
privateStringaddressdetail;
三、表模型
mysql>descaddress_11fk;
+---------------+--------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+---------------+--------------+------+-----+---------+----------------+
|addressid|int(11)|NO|PRI|NULL|auto_increment|
|addressdetail|varchar(255)|YES||NULL||
+---------------+--------------+------+-----+---------+----------------+
mysql>descperson_11fk;
+-----------+--------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+-----------+--------------+------+-----+---------+----------------+
|personid|int(11)|NO|PRI|NULL|auto_increment|
|name|varchar(255)|YES||NULL||
|age|int(11)|YES||NULL||
|addressId|int(11)|YES|UNI|NULL||
+-----------+--------------+------+-----+---------+----------------+
四、生成的SQL脚本
CREATETABLE`address_11fk`(
`addressid`int(11)NOTNULLauto_increment,
`addressdetail`varchar(255)defaultNULL,
PRIMARYKEY (`addressid`)
)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=gbk;
CREATETABLE`person_11fk`(
`personid`int(11)NOTNULLauto_increment,
`name`varchar(255)defaultNULL,
`age`int(11)defaultNULL,
`addressId`int(11)defaultNULL,
PRIMARYKEY (`personid`),
KEY`FK68A8818F3F45AA77`(`addressId`),
CONSTRAINT`FK68A8818F3F45AA77`FOREIGNKEY(`addressId`)REFERENCES`address_11fk`(`addressid`)
)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=gbk;
五、映射方法:
在Person中添加Address属性,映射配置为:
--用来映射关联POcolumn是Address在该表中的外键列名,增加unique变成“1-1”-->
--用来映射关联POcolumn是Address在该表中的外键列名,增加unique变成“1-1”-->
六、测试方法
publicclassTest_11fk{
publicstaticvoidmain(String[]args){
Person11fkp1=newPerson11fk();
p1.setAge(21);
p1.setName("p1");
Address11fkadd1=newAddress11fk();
add1.setAddressdetail("郑州市经三路");
p1.setAddress11fk(add1);
Sessionsession=HibernateUtil.getCurrentSession();
Transactiontx=session.beginTransaction();
session.save(add1);
session.save(p1);
mit();
HibernateUtil.closeSession();
}
}
七、测试结果
1):
正常保存.推荐这么干!
session.save(add1);
session.save(p1);
Hibernate:
insertintoADDRESS_11fk(addressdetail)values(?
)
Hibernate:
insertintoPERSON_11fk(name,age,addressId)values(?
?
?
)
2):
正常保存.
session.save(p1);
session.save(add1);
Hibernate:
insertintoPERSON_11fk(name,age,addressId)values(?
?
?
)
Hibernate:
insertintoADDRESS_11fk(addressdetail)values(?
)
Hibernate:
updatePERSON_11fksetname=?
age=?
addressId=?
wherepersonid=?
3):
正常保存.
//session.save(p1);
session.save(add1);
Hibernate:
insertintoADDRESS_11fk(addressdetail)values(?
)
4):
发生异常,不能保存.
session.save(p1);
//session.save(add1);
Hibernate:
insertintoPERSON_11fk(name,age,addressId)values(?
?
?
)
Exceptioninthread"main"org.hibernate.TransientObjectException:
com.lavasoft.dx._1_1_fk.Address11fk
Hibernate一对一主键单向关联
2007-08-2215:
26:
52
标签:
Hibernate一对一 [推送到技术圈]
版权声明:
原创作品,如需转载,请与作者联系。
否则将追究法律责任。
Hibernate一对一主键单向关联
1-1的关联可以基于主键关联,但基于主键关联的持久化类不能拥有自己的主键生成策略,它的主键由关联类负责生成。
另外,另外,增加one-to-one元素来关联属性,必须为one-to-one元素增加constrained="true"属性,表明该类主键由关联类生成。
一、模型介绍
一个人(Person)对应一个地址(Address)。
二、实体(省略getter、setter方法)
publicclassPerson11pk{
privateintpersonid;
privateStringname;
privateintage;
privateAddress11pkaddress11pk;
publicclassAddress11pk{
privateintaddressid;
privateStringaddressdetail;
三、表模型
mysql>descaddress_11pk;
+---------------+--------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+---------------+--------------+------+-----+---------+----------------+
|addressid|int(11)|NO|PRI|NULL|auto_increment|
|addressdetail|varchar(255)|YES||NULL||
+---------------+--------------+------+-----+---------+----------------+
mysql>descperson_11pk;
+----------+--------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+----------+--------------+------+-----+---------+-------+
|personid|int(11)|NO|PRI|||
|name|varchar(255)|YES||NULL||
|age|int(11)|YES||NULL||
+----------+--------------+------+-----+---------+-------+
四、生成的SQL脚本
/*Formattedon2007/08/2214:
40(QP5v5.50)*/
CREATETABLE`address_11pk`(
`addressid`int(11)NOTNULLauto_increment,
`addressdetail`varchar(255)defaultNULL,
PRIMARYKEY(`addressid`)
)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=gbk;
/*Formattedon2007/08/2214:
41(QP5v5.50)*/
CREATETABLE`person_11pk`(
`presonid`int(11)NOTNULL,
`name`varchar(255)defaultNULL,
`age`int(11)defaultNULL,
PRIMARYKEY(`presonid`),
KEY`FK68A882C591BB393E`(`presonid`),
CONSTRAINT`FK68A882C591BB393E`FOREIGNKEY(`presonid`)REFERENCES`address_11pk`(`addressid`)
)ENGINE=InnoDBDEFAULTCHARSET=gbk;
五、映射方法:
在Person中配置id生成策略为:
--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
--关联持久化类的属性名-->
address11pk
......
--用于映射1-1关联-->
--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
--关联持久化类的属性名-->
address11pk
--用于映射1-1关联-->
六、测试方法
publicclassTest_11pk{
publicstaticvoidmain(String[]args){
Person11pkp1=newPerson11pk();
p1.setAge(21);
p1.setName("p1");
Address11pkadd1=newAddress11pk();
add1.setAddressdetail("郑州市经三路");
p1.setAddress11pk(add1);
Sessionsession=HibernateUtil.getCurrentSession();
Transactiontx=session.beginTransaction();
session.save(add1);
session.save(p1);
mit();
HibernateUtil.closeSession();
}
}
七、测试结果
1):
正常保存.推荐这么干!
session.save(add1);
session.save(p1);
Hibernate:
insertintoADDRESS_11fk(addressdetail)values(?
)
Hibernate:
insertintoPERSON_11fk(name,age,addressId)values(?
?
?
)
2):
正常保存.
session.save(p1);
session.save(add1);
Hibernate:
insertintoPERSON_11fk(name,age,addressId)values(?
?
?
)
Hibernate:
insertintoADDRESS_11fk(addressdetail)values(?
)
Hibernate:
updatePERSON_11fksetname=?
age=?
addressId=?
wherepersonid=?
3):
正常保存.
//session.save(p1);
session.save(add1);
Hibernate:
insertintoADDRESS_11fk(addressdetail)values(?
)
4):
发生异常,不能保存.
session.save(p1);
//session.save(add1);
Hibernate:
insertintoPERSON_11fk(name,age,addressId)values(?
?
?
)
Exceptioninthread"main"org.hibernate.TransientObjectException:
com.lavasoft.dx._1_1_fk.Address11fk
Hibernate一对一连接表单向关联
2007-08-2215:
53:
57
标签:
Hibernate一对一连接表 [推送到技术圈]
版权声明:
原创作品,如需转载,请与作者联系。
否则将追究法律责任。
Hibernate一对一连接表单向关联
这种情况很少见,但Hibernate同样允许采用连接表关联1-1.有连接表的1-1同样只需要将N-1的many-to-one元素增加unique="true"属性即可。
一、模型介绍
一个人(Person)对应一个地址(Address)。
二、实体(省略getter、setter方法)
publicclassPerson11tab{
privateintpersonid;
privateStringname;
privateintage;
privateAddress11tabaddress11tab;
publicclassAddress11tab{
privateintaddressid;
privateStringaddressdetail;
三、表模型
mysql>descaddress_11tab;
+---------------+--------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+---------------+--------------+------+-----+---------+----------------+
|ad