一方:
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,感谢
记录学习情况