hibernate(九)注解方式的多表操作一对一和多对多

来源:互联网 发布:台湾电信诈骗知乎 编辑:程序博客网 时间:2024/05/21 08:57

基于外键一对一

通过多对一表示一对一,与之前多对一不同的是在设置关系是添加一个确保外键唯一性的属性unique。

创建身份证配置主键的注解、类的注解

package com.hibernate.entity;import java.io.Serializable;import javax.persistence.*;@Entitypublic class IdCard  implements Serializable {      private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy=GenerationType.AUTO)    private Integer  id;    private String cardNumber;}

创建人包含一个身份证的引用配置主键、类、关系的注解

package com.hibernate.entity;import java.io.Serializable;import javax.persistence.*;@Entitypublic class Person implements Serializable {    private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy=GenerationType.AUTO)    private Integer id;    private String perName;    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)    @JoinColumn(name="fk_p_i",unique=true)    private IdCard idCard;}

基于主键一对一

在身份证中添加人的引用,并为其添加一对一的关系。

package com.hibernate.entity;import java.io.Serializable;import javax.persistence.*;@Entitypublic class IdCard  implements Serializable {      private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy=GenerationType.AUTO)    private Integer  id;    private String cardNumber;    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)    @PrimaryKeyJoinColumn    private Person person;}

人中主键的注解有所改变
@GeneratedValue:generator属性的值自己书写
@GenericGenerator:需要配三个属性,name的值是上面自己书写的名称,strategy属性表示主键来源于外部,parameters属性:相当于xml中配置的那个参数,其中name固定,value表示主键的自增来源于外部的本类中的那个属性。
身份证引用的注解改为一对一关系其中的mappedBy相当于添加约束

package com.hibernate.entity;import java.io.Serializable;import javax.persistence.*;import org.hibernate.annotations.GenericGenerator;import org.hibernate.annotations.Parameter;@Entitypublic class Person implements Serializable {    private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(generator="generator")    @GenericGenerator(name="generator",strategy="foreign",    parameters=@Parameter(name="property",value="idCard"))    private Integer id;    private String perName;    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="person")    private IdCard idCard;    }

运行使其生成表,运行结果只有简单的创建表的语句。

这里写图片描述

观察数据库中创建的表可以发现根本没有外键,但是可以查询出来,这是hibernate内部做的。

这里写图片描述这里写图片描述
多对多

新建演员类和角色类,两个类中各自包含一个对方的集合。主要是多对多的关系。用到的标签:
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name=”tb_actor_roler”,joinColumns={@JoinColumn(name=”fk_a_r”)},
inverseJoinColumns={@JoinColumn(name=”fk_r_a”)})
JoinTable:创建中间表的标签。name属性表的名称;joinColumns属性表的列;{@JoinColumn(name=”fk_a_r”)}表中的一个字段注意要用大括号;inverseJoinColumns反向表的另外一列。
创建类的时候必须有标识,不然无法创建主键,主键不能配置uuid方式,因此标识的类型不能是String

package com.hibernate.entity;import java.util.HashSet;import java.util.Set;import javax.persistence.*;@Entitypublic class Actor implements java.io.Serializable{    private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy=GenerationType.AUTO)    private Integer id;    @Column(length=50)    private String actorName;    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)    @JoinTable(name="tb_actor_roler",joinColumns={@JoinColumn(name="fk_a_r")},    inverseJoinColumns={@JoinColumn(name="fk_r_a")})    private Set<Roler>setRoler=new HashSet<Roler>();}

创建角色类添加注解类、多对多关系的注解,注解中包括约束。

package com.hibernate.entity;mport java.util.HashSet;import java.util.Set;import javax.persistence.*;@Entitypublic class Roler  implements java.io.Serializable {    private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy=GenerationType.AUTO)    private Integer id;    @Column(length=50)    private String rolerName;    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="setRoler")    private Set<Actor>setActor=new HashSet<Actor>();}

添加时会出现中间表的数据加不上的问题。可能从一端可以添加进去,从另一端添加不进去。

阅读全文
0 0
原创粉丝点击