Hibernate一对多关系映射

Hibernate一对多关系映射

一对多联系
首先了解一下,什么是一对多联系
两个实体型之间的联系
在这里插入图片描述
实体间的关系

  1. 单向一对多关联
  2. 单向多对一关联
  3. 双向一对多关联
    在这里插入图片描述
    下面将会通过用户——订单的例子来进行讲解
    在关系模型中,只存在外键参照关系,而且是many方参照one方
    在这里插入图片描述

Hibernate单向一对多关联

User类

public class User {
	private Integer id;
	private String userName;
	private String password;
	private Set orders = new HashSet<Order>();
	......
}

Order类

public class Order {
	private Integer id;
	private Double price; // 价格
	......
}

在一对多这个一方(这里即User类)可以有三种方式来存储Order

  1. set
    配置文件
    Order.hbm.xml
    正常配置
    User.hbm.xml
    	<set name="orders" cascade="all"> 
    	    <!--user_id是在Order表中的一个字段
    	    key元素:column属性设定所关联类对应表的外键(这里的user_id是Order表的外键对应User表的主键)
    	    one-to-many元素:class属性设定所关联的类
    	    -->
    		<key column="user_id"/>
    		<one-to-many class="Order" />
    	</set>
    	```	
    --
    

注解配置

在User类中的orders属性前加:对应Order表中的外键名为user_id
其他正常配置

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")

在Order类中正常配置

  1. list
    使用List映射时,需要在Order表中添加一个额外的字段ORDERINDEX来表示插入顺序
    在这里插入图片描述
private List<Order> orders = new ArrayList<>();
**配置文件**
需要借助一个属性index,即在Order表中需要添加一个字段为order_index

index元素子元素
column属性:指定Order表总记录插入顺序的列名

<list name="orders" cascade="all">
	<key column="user_id"></key>
	<index column="order_index"></index>
	<one-to-many class="Order"/>
</list>
**注解配置**
在User类中的orders属性前加:对应Order表中的外键名为user_id

其他正常配置

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")

在Order类中正常配置
3. map
使用Map来进行映射的时候,需要在Order表中添加一个额外字段ORDERKEY来记录Map的key值 Map=>(key,value)来记录key值的
在这里插入图片描述

private Map orders = new HashMap<>();
**配置文件**

index子元素:
column属性:指定记录Map中key值得字段名
type属性:指定Map中的key值的类型
注意这个不可省略,必须指定
<map name="orders" cascade="all">
	<key column="user_id"></key>
	<index column="order_key" type="string"></index>
	<one-to-many class="Order"/>
</map>
**注解配置**
在User类中的orders属性前加:对应Order表中的外键名为user_id

其他正常配置

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")

在Order类中正常配置

双向一对多关联

要向完成双向一对多的关联,这个时候需要在Order实体类中添加user属性

public class Order {
private Integer id;
private Double price; // 价格
private User user;
......
}

当然也需要修改Order.hbm.xml文件
添加many-to-one标签
name属性:指定需映射的属性名(实体类对应的名字)
column属性:指定Order中的外键列名
class属性:指定所关联的类型

<many-to-one name="user" column="user_id"></many-to-one>

注解配置
在User类中的orders属性前可以使用之前的那种方式如下:

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")

也可以采用:
mappedBy实现双向互连
mappedBy:表明是双向关联关系,并且与user建立对应
targetEntity:指定了所关联的类型
cascade:指定级联操作

@OneToMany(mappedBy = "user",targetEntity = Order.class,cascade = CascadeType.ALL)

Order类中首先保证有了user属性,在usr属性前使用many-to-one来指定order类中中的外键

@ManyToOne
	@JoinColumn(name = "user_id")

接下来便可以通过user访问到其所拥有的订单,也可以根据订单找到其用户

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值