Hibernate中one-to-many/many-to-one和many-to-many

本文详细介绍了数据库中一对一、一对多及多对多关联关系的实现方法,并提供了具体的表结构定义和配置文件示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<1>one-to-many/many-to-one

(1)表结构

/**客户表**/
create table CUSTOMERS(
ID int not null auto_increment,
Name varchar(15),
primary key(ID)
);

/**订单表**/
create table ORDERS(
ID bigint not null auto_increment,
ORDER_NUMBER varchar(15),
CUSTOMER_ID int not null,
primary key(ID),
foreign key (CUSTOMER_ID) references CUSTOMERS(ID)
);

(2)Customers.hbm.xml

<set 
name="Orders"
inverse="true"
lazy="false"
cascade="all">
<key column="CUSTOMER_ID"/>
<one-to-many class="Orders"/>
</set>


说明:inverse="true",Customers端无须维护这个关联关系。也就是当Customers对象变化时,不用同步更新它的关联的Orders(Orders这端的inverse="false",表明由它来维护关系),这样避免双方重复更新同一关系。

(3)Orders.hbm.xml

<many-to-one
name="Customer"
column="CUSTOMER_ID"
class="Customers"
not-null="true"
>
</many-to-one>


<2>many-to-many

(1)表结构

create table AUTHORIZATION(
ID bigint(20) not null auto_increment,
AUTH int(11),
AUTHORIZE int(11),
PRIMARY KEY (ID)
);

create table USR(
ID bigint(20) not null auto_increment,
NAME varchar(16),
PRIMARY KEY (ID)
);

/**双向关联的中间连接表**/
create table USERAUTH(
ID bigint(20) not null auto_increment,
USER_ID bigint(20),
AUTH_ID bigint(20),
PRIMARY KEY (ID)
);

(2)Authorization.hbm.xml

<set name="users"
table="userauth"
inverse="false"
cascade="all">
<key column="AUTH_ID"/>
<many-to-many class="Usr" column="USER_ID"/>
</set>


(3)Usr.hbm.xml

<set name="auths"
table="userauth"
cascade="all"
inverse="true"><!--由Authorization一端来维护关系-->
<key column="USER_ID"/>
<many-to-many class="Authorization" column="AUTH_ID"/>
</set>


说明:多对多关系,通过一个中间连接表,分离成了两个一对多关系。

测试:
		Usr userA = new Usr();
Usr userB = new Usr();
userA.setName("jinming");
userB.setName("genghua");

Authorization auth1 = new Authorization();
Authorization auth2 = new Authorization();
auth1.setAuth(0);
auth1.setAuth(10);
auth2.setAuth(1);
auth2.setAuthorize(11);

Set<Authorization> set1 = new HashSet<Authorization>();
set1.add(auth1);
set1.add(auth2);
userA.setAuths(set1);
userB.setAuths(set1);

Set<Usr> set2 = new HashSet<Usr>();
set2.add(userA);
set2.add(userB);
auth1.setUsers(set2);
auth2.setUsers(set2);

userDao.save(userA);
userDao.save(userB);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值