Hibernate一对多关系映射
一对多联系
首先了解一下,什么是一对多联系
两个实体型之间的联系
实体间的关系
- 单向一对多关联
- 单向多对一关联
- 双向一对多关联
下面将会通过用户——订单的例子来进行讲解
在关系模型中,只存在外键参照关系,而且是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
- 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类中正常配置
- 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访问到其所拥有的订单,也可以根据订单找到其用户