Hibernate关系映射
分类
一对一(单向和双向)
一对多(单向和双向)
多对一(单向和双向)
多对多(单向和双向)
建立双向关系的两种方法
1.在两个实体里都建立关系(详细做法参照下面的例子双向一对多和双向多对一)
2. 在被拥有方方加mappedby,mappedBy的意思就是“被映射”,即mappedBy这方不用管关联关系,关联关系交给另一方处理(参照下面的例子双向一对一和双向多对多)
Mappedby的理解
1.只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
2.mappedBy标签一定是定义在被拥有方的,它指向拥有方;
3.mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的;
4.mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。
mappedBy表示声明自己不是一对多的关系维护端,由对方来维护,是在一的一方进行声明的。mappedBy的值应该为一的一方的表名。
Mappedby的4个原则
2.关系 mappedby(放弃维护关系) 只保存数据 不维护关系
3.保存数据 双向关联的时候 如果想要保存数据 必须保存维护关系哪一方
4.除了级联的保存之外 其他的级联关系不受任何影响
一、一对一(单向和双向)
例子:一个人(Person)只有一张身份证(IdCard)
在双向一对一中,维护关系的一方不需要改动,只需要在非关系维护端加上
@OneToOne(mappedby="") mappedby 里面 返回值类型Person 中的外键关联属性
//维护关系端
public class Person {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid",strategy = "uuid")
private String pid;
private String name;
private int sex;
@Temporal(value = TemporalType.DATE)
private Date born;
private String address;
//加@OneToOne并且有外键的一方维护关系
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "cid",nullable = false,unique = true)//给Person类添加一个外键
private IdCard idCard;
}
单向一对一
public class IdCard {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid",strategy = "uuid")
private String cid;
private String cardNum;
}
双向一对一
public class IdCard {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid",strategy = "uuid") private String cid; private String cardNum; /** * 在非关系维护端 添加我们实体引用 * @OneToOne(mappedby="") mappedby 里面 返回值类型Person 中的外 键 关联属性 * 非关系维护端 没有外键的那一个实体 * 单向 通过一方去操作另外一方 操作包含增删查改的操作 * 双向 可以随便通过一方去操作另外一方 * 很多疑问: * 1个概念 关系维护端 关系非维护端 * mappedby只保存数据,不维护关系 */ @OneToOne(mappedby="idcard",cascade=CascadeType.ALL) private Person person; }
二、一对多(单向和双向)
例子:一种商品分类(Catalog)对应多种商品(Product)
//维护关系的一方
public class Catalog {
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String cataid;
private String cataname;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "catalogid")
@OrderBy("orderindex desc")
private List<Product> products;
}
单向一对多
public class Product {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
private String pid;
/**
* 商品名称
*/
private String pname;
/**
* 商品简介
*/
private String pinfo;
/**
* 商品编号
*/
private String productcode;
private String artno;
private String unit;
private BigDecimal price;
private BigDecimal saleprice;
private int score;
private BigDecimal discount;
/**
*库存量
*/
private BigDecimal pcount;
private String remark;
private int orderindex;
}
双向一对多
public class Product {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
private String pid;
/**
* 商品名称
*/
private String pname;
/**
* 商品简介
*/
private String pinfo;
/**
* 商品编号
*/
private String productcode;
private String artno;
private String unit;
private BigDecimal price;
private BigDecimal saleprice;
private int score;
private BigDecimal discount;
/**
*库存量
*/
private BigDecimal pcount;
private String remark;
private int orderindex;
@ManyToOne(cascade=Cascade.ALL)
joinColumn(name="catalogid")
privete List<Catalog> catalogs;
}
三、多对一(单向和双向)
例子:多种产品对应一种商品分类
public class Product {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name="uuid",strategy = "uuid")
private String pid;
/**
* 商品的名称
*/
private String pname;
/**
* 商品简介
*/
private String pinfo;
/**
* 商品的编号
*/
private String productcode;
private String artno;
private String unit;
private BigDecimal price;
private BigDecimal saleprice;
private int score;
private BigDecimal discount;
/**
* 库存量
*/
private BigDecimal pcount;
private String remark;
private int orderindex;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "catalogid")
private Catalog catalog;
}
单向多对一
public class Catalog {
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String cataid;
private String cataname;
}
双向多对一
public class Catalog {
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String cataid;
private String cataname;
@OneToMany(mappedby="catalog",cascade=Cascade.ALL)
private Set<Product>product;
}
四、多对多(单向和双向)
例子:购物车和商品
public class ShopCar{
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String sid;
@ManyToMany(cascade = CascadeType.ALL)
//建立一张中间表
@JoinTable(name = "T_Pro_Car",joinColumns = {@JoinColumn(name = "carid")},inverseJoinColumns = {@JoinColumn(name = "pid")})/
private List<Product>productList;
}
单向多对多
public class Product {
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String pid;
private String pname;
private BigDecimal price;
private Long pcount;
//销售数量
private Long salecount;
//收藏数量
private Long collect;
@ManyToMany(cascade = CascadeType.ALL)
private List<ShopCar>shopCars;
}
双向多对多
public class Product {
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String pid;
private String pname;
private BigDecimal price;
private Long pcount;
//销售数量
private Long salecount;
//收藏数量
private Long collect;
@ManyToMany(mappedBy = "productList",cascade = CascadeType.ALL)
private List<ShopCar>shopCars;
}