hibernate 關聯關係配置(一對多,多對一)
阿新 • • 發佈:2018-11-29
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)方,所以訂單包含一個集合用於儲存多個訂單項,訂單項包含一個訂單用於儲存關聯自己的訂單。
一對多關聯關係有一種特例:自身一對多關聯(感受下吧,木得程式碼)。