1. 程式人生 > >hibernate 關聯關係配置(一對多,多對一)

hibernate 關聯關係配置(一對多,多對一)

Hibernate 關聯關係:

       1. 什麼是關聯(association)
           1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如:類A裡面 關聯 類B

  1.     public class A{
  2.         private B b = new B;//設定類B為類A的屬性
  3.         public A(){}
  4.       }

        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)方,所以訂單包含一個集合用於儲存多個訂單項,訂單項包含一個訂單用於儲存關聯自己的訂單。

 

 

 

一對多關聯關係有一種特例:自身一對多關聯(感受下吧,木得程式碼)。