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

基于外键一对一

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

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

package com.hibernate.entity;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public 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.*;
@Entity
public 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.*;
@Entity
public 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;
@Entity
public 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.*;
@Entity
public 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.*;
@Entity
public 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值