Hibernate 关联关系:
1. 什么是关联(association)
1.1 关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。例如:类A里面 关联 类B
- public class A{
- private B b = new B;//设置类B为类A的属性
- public A(){}
- }
1.2 关联的分类:关联可以分为一对一、一对多/多对一、多对多关联 ,关联是有方向的
“一对多” 是最普遍的关系映射,简单来讲就如订单和订单项的关系,
“一对多” :一个订单项可以有多个订单项,对应着1+n个订单项,也就是说一个订单至少有着一个订单子项
“多对一” :多个订单项可以对应同一个订单
订单方:
package com.practice.entity;
import java.util.HashSet;
import java.util.Set;
public class Order {
private Integer order_id;
private String order_no;
//一个订单对应着多个订单,采用集合
private Set<OrderItem> orderItems = new HashSet<>();
private Integer initOrderItems = 0;
public Integer getInitOrderItems() {
return initOrderItems;
}
public void setInitOrderItems(Integer initOrderItems) {
this.initOrderItems = initOrderItems;
}
public Set<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(Set<OrderItem> orderItems) {
this.orderItems = orderItems;
}
public Integer getOrder_id() {
return order_id;
}
public void setOrder_id(Integer order_id) {
this.order_id = order_id;
}
public String getOrder_no() {
return order_no;
}
public void setOrder_no(String order_no) {
this.order_no = order_no;
}
}
订单项:
package com.practice.entity;
public class OrderItem {
private Integer order_item_id;
private Integer product_id;
private Integer quantity;
private Integer oid;
//运行时 报 repeated column 重复列映射错误 添加insert update 等于 false解决,或者删除属性列的配置
//多个订单项对应着同一个订单
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public Integer getOrder_item_id() {
return order_item_id;
}
public void setOrder_item_id(Integer order_item_id) {
this.order_item_id = order_item_id;
}
public Integer getProduct_id() {
return product_id;
}
public void setProduct_id(Integer product_id) {
this.product_id = product_id;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
}
关联关系配置(一对多):订单 ------> 订单项
<?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>
<!-- name:类的全限定名 table:指的是类所对应的表 -->
<class name="com.practice.entity.Order" table="t_hibernate_order">
<!-- name:类属性 type:类属性类型 column:对应的表列字段 -->
<id name="order_id" type="java.lang.Integer" column="order_id">
<!-- 配置数据库表的主键生成策略 -->
<generator class="increment"></generator>
</id>
<property name="order_no" type="java.lang.String" column="order_no"></property>
<!-- cascade级联属性配置: inverse:关联关系交给对方维护 -->
<!-- 使用集合体现一对多的关系,name属性名 -->
<set name="orderItems" cascade="save-update" inverse="true">
<!-- column两表关联的字段ID -->
<key column="oid"></key>
<!-- 一对多关系 class类型对应的对象权限定名 -->
<one-to-many class="com.practice.entity.OrderItem"/>
</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>
<!-- name:类的全限定名 table:指的是类所对应的表 -->
<class name="com.practice.entity.OrderItem" table="t_hibernate_order_item">
<!-- name:类属性 type:类属性类型 column:对应的表列字段 -->
<id name="order_item_id" type="java.lang.Integer" column="order_item_id">
<!-- 配置数据库表的主键生成策略 -->
<generator class="increment"></generator>
</id>
<property name="product_id" type="java.lang.Integer" column="product_id"></property>
<property name="quantity" type="java.lang.Integer" column="quantity"></property>
<property name="oid" type="java.lang.Integer" column="oid"></property>
<!-- 多对一关系 name属性名 class类型对应的对象权限定名 column关联ID -->
<many-to-one name="order" class="com.practice.entity.Order" column="oid" insert="false" update="false">
</many-to-one>
</class>
</hibernate-mapping>
"一对多"关联关系,订单(Order)方对应多个订单项(OrderItem)方,所以订单包含一个集合用于存储多个订单项,订单项包含一个订单用于储存关联自己的订单。
一对多关联关系有一种特例:自身一对多关联(感受下吧,木得代码)。