Hibernate关系映射

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个原则

1.属性 返回值类型Shopcar里面和外键关联的那个属性user
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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值