Hibernate关于一对多 多对一 多对多关联关系的设置

写这篇文章主要是介绍一下hibernate关于一对多 多对一 多对多关联关系的设置。

看似三个问题解决起来实则是2个问题,因为多对一和一对多的处理是反向的。

下面我们先从一对多入手,对于一对多我们从两个方面讲解:

1)一对多单向关联关系

2)一对多双向关联关系

我们使用User和OrderItem来描述,一个user可以拥有多个订单,一个订单只能属于一个user

在调试这段代码的时候闹了一点小插曲,我一开始是使用order作为表名称的,打算直接让hibernate生成表结构,没想到hibernate.cfg.xml配置没有问题,ORM映射文件配置也没有问题,但就是报错,苦思冥想了一天还没有解决,晚上一看自己真是sb,order在mysql中是关键字,关键字啊~~!mb浪费我一天时间,还以为是什么nb的bug呢,希望大家也注意一下。


首先我们来敲两个实体类User 和OrderItem

public class User {
	private Long uid;
	private String username;
	private String password;
//set,get方法就不粘了
}

public class OrderItem {
	private Long oid;
	private String name;
	private User user;
}


然后配置ORM映射文件

user的映射文件和正常的一样,就不赘述了。

OrderItem的ORM映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="domain">
	<class name="OrderItem" table="OrderItem">
		<id name="oid">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<!-- name 该对象的属性名 class设置该属性的类型 column设置外键名称 -->
		<many-to-one name="user" class="User" column="uid"></many-to-one>
	</class>
</hibernate-mapping>

好了,单向关联就这么简单。

下面来说一下双向关联

双向关联关系只不过是在user中添加Set<OrderItem>属性,在ORM映射文件中配置一下即可,简单看一下代码就不在复杂的讲解了。

<!-- 见名知意我们就不许要解释了吧 -->
		<set name="orders">
			<key column="uid"></key>
			<one-to-many class="OrderItem"/>
		</set>

private Set<OrderItem> orders;


值得一提的是默认情况下双向关联关系关联双方都会维护关联关系,具体体现就是多执行几条update语句或insert语句。我们可以清楚这样执行效率会大大降低的。

在hibernate中通过在set标签中添加inverse属性来决定是由双向关联关系的哪一方来维护表与表之间的关系,inverse=false为主动方(维护关系),inverse=true为被动方(不维护关系),默认为false,在多对一关系中,将n的一方设置为主动方有助于性能的改善。

下面说一下多对多关系的配置:

首先要想建立多对多关系的话,必须存在第三张表,来关联,我想这一点我就不用在阐述了吧,我记得我写的mysql中提到过,有兴趣的可以参看以下。

然后我们直接上手建立多对多关系:

1)两个javabean

public class Role {
	private Long id;
	private String name;
	private Set<User> users;
//set,get方法省略
}
public class User {
	private Long id;
	private String name;
	private Set<Role> roles;
}

ORM映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="domain">
	<class name="User">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		
<!-- 		必须有一方放弃关系的维护,因为我们创建的第三张表是以role_id和user_id为主键的,如果
		双方都维护关系的话会重复插入相同的数据进而报错 -->
		<set name="roles" inverse="true" table="user_role">
		
			<key column="user_id"></key><!-- 在user_role表中的外键名 -->
			
			<many-to-many class="Role" column="role_id"></many-to-many>
			<!-- role在user_role表下的外建名 -->
			
		</set>
	</class>
</hibernate-mapping>    


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="domain">
	<class name="Role">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<set name="users" table="user_role">
			<key column="role_id"></key>
			<many-to-many class="User" column="user_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>


哦了,就这麽简单就完事了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值