hibernate之雙向一對多(註解方式)

一方:


package com.cwenhui.demo.model;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity
@Table(name="goods_type")
public class GoodsType implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -5397949036775130583L;
	
	@Id
	@Column(name="goodsTypeId")
	@GeneratedValue
	private int goodsTypeId;
	
	@Column(name="goodsTypeName")
	private String goodsTypeName;
	
	@OneToMany(mappedBy="goodsType",cascade = CascadeType.MERGE, targetEntity = Goods.class, fetch=FetchType.EAGER)
	private Set<Goods> goods= new HashSet<Goods>();

	public GoodsType() {
//		super();
	}

	public GoodsType(String goodsTypeName) {
//		super();
		this.goodsTypeName = goodsTypeName;
	}

	public int getGoodsTypeId() {
		return goodsTypeId;
	}

	public void setGoodsTypeId(int goodsTypeId) {
		this.goodsTypeId = goodsTypeId;
	}

	public String getGoodsTypeName() {
		return goodsTypeName;
	}

	public void setGoodsTypeName(String goodsTypeName) {
		this.goodsTypeName = goodsTypeName;
	}

	public Set<Goods> getGoods() {
		return goods;
	}

	public void setGoods(Set<Goods> goods) {
		this.goods = goods;
	}

	@Override
	public String toString() {
		return "GoodsType [goodsTypeId=" + goodsTypeId + ", goodsTypeName="
				+ goodsTypeName + ", goods=" + goods + "]";
	}
	
	

}



多方:

package com.cwenhui.demo.model;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Entity(name="goods")
@JsonIgnoreProperties(value={"goodsType"})				//忽略json結果中的goodsType字段,避免死循環
public class Goods implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -3186260988079048370L;
	
	@Id
	@Column(name="goodsId")
	@GeneratedValue
	private int goodsId;
	
	@Column(name="goodsName")
	private String goodsName;
	
	@Column(name="goodsPrice")
	private int goodsPrice;
	
	@Column(name="goodsSales")
	private int goodsSales;
	
	@Column(name="goodsDesc")
	private String goodsDesc;
	
	@Column(name="goodsImgPath")
	private String goodsImgPath;
	
	@Column(name="goodsRemain")
	private int goodsRemain;
	
	@ManyToOne(targetEntity=GoodsType.class, cascade=CascadeType.ALL)
	@JoinColumn(name="goodsTypeId")		//外鍵
	private GoodsType goodsType;

	public Goods() {
//		super();
	}

	public Goods(String goodsName, int goodsPrice, String goodsDesc,
			String goodsImgPath, int goodsRemain) {
		super();
		this.goodsName = goodsName;
		this.goodsPrice = goodsPrice;
		this.goodsDesc = goodsDesc;
		this.goodsImgPath = goodsImgPath;
		this.goodsRemain = goodsRemain;
	}

	public int getGoodsId() {
		return goodsId;
	}

	public void setGoodsId(int goodsId) {
		this.goodsId = goodsId;
	}

	public String getGoodsName() {
		return goodsName;
	}

	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}

	public int getGoodsPrice() {
		return goodsPrice;
	}

	public void setGoodsPrice(int goodsPrice) {
		this.goodsPrice = goodsPrice;
	}

	public int getGoodsSales() {
		return goodsSales;
	}

	public void setGoodsSales(int goodsSales) {
		this.goodsSales = goodsSales;
	}

	public String getGoodsDesc() {
		return goodsDesc;
	}

	public void setGoodsDesc(String goodsDesc) {
		this.goodsDesc = goodsDesc;
	}

	public String getGoodsImgPath() {
		return goodsImgPath;
	}

	public void setGoodsImgPath(String goodsImgPath) {
		this.goodsImgPath = goodsImgPath;
	}

	public int getGoodsRemain() {
		return goodsRemain;
	}

	public void setGoodsRemain(int goodsRemain) {
		this.goodsRemain = goodsRemain;
	}

	public GoodsType getGoodsType() {
		return goodsType;
	}

	public void setGoodsType(GoodsType goodsType) {
		this.goodsType = goodsType;
	}

	@Override
	public String toString() {
		return "Goods [goodsId=" + goodsId + ", goodsName=" + goodsName
				+ ", goodsPrice=" + goodsPrice + ", goodsSales=" + goodsSales
				+ ", goodsDesc=" + goodsDesc + ", goodsImgPath=" + goodsImgPath
				+ ", goodsRemain=" + goodsRemain + ", goodsType=" + goodsType
				+ "]";
	}
	
	
}


OneToMany自然表示一對多

targetEntity 的參數, 該參數定義了目標實體名.通常不需要定義該參數, 因爲在大部分情況下默認值(表示關聯關係的屬性類型)就可以很好的滿足要求了.

也就是說hibernate能通過屬性的類型來決定這個值,所以設不設該值問題不大。

cascade表示級聯風格,ALL=save-update,delete

最主要的就是mappedBy因爲沒有映射文件中的 inverse,mappedBy來定義由誰來維護外鍵的。

在一對多的時候,多的一方是關係維護端,一的一方是關係被維護端。在關係被維護端裏面有mappedBy 關係維護方對應的表中應該有外鍵

在本例中,GoodsType爲關係被維護方,所以要在集合上聲明mappedBy,表示外鍵由哪一方維護(這樣有個好處,insert之後不會執行相應的update,就不會過於影響性能)。不設置的默認情況下,外鍵是由一的一方維護的(insert之後會執行相應的update

在多的一方,也就是Goods中應該會有一個屬性goodsType指定它的類型(一方),同時對應的表中的外鍵列,即goodsTypeId

參考自關聯一對多:http://guobin6125.iteye.com/blog/1597937,感謝

記錄學習情況




發佈了30 篇原創文章 · 獲贊 10 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章