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>();}
添加时会出现中间表的数据加不上的问题。可能从一端可以添加进去,从另一端添加不进去。
- hibernate(九)注解方式的多表操作一对一和多对多
- Hibernate 基于注解的方式 实现的关系映射案例(一对一关系,一对多关系,多对多关系)
- hibernate 注解 一对一和一对多
- hibernate学习一对一,一对多,多对一,多对多,注解版和XML版
- Hibernate关系(双向一对一、一对多、多对多和自身多对多)映射注解整理
- Hibernate的关联关系注解映射(一对一、一对多、多对一、多对多、自连接)
- Hibernate一对一注解,一对多注解
- hibernate(八)注解基础、注解映射表、注解多表操作多对一和一对多
- hibernate多表操作2(七)一对一、多对多
- hibernate关联关系注解(一对多、多对一、一对一)
- Hibernate双向多对多 注解方式
- hibernate使用注解的方式进行多对一关联
- hibernate——一对一、多对一和多对多关系的比较
- hibernate——一对一、多对一和多对多关系的比较
- MyBatis注解方式与映射文件方式配合实现一对一,一对多,多对多(一)
- MyBatis注解方式与映射文件方式配合实现一对一,一对多,多对多(二)
- MyBatis注解方式与映射文件方式配合实现一对一,一对多,多对多(三)
- Hibernate数据关联映射之一对一和多对多
- 对象Object++、String
- “Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured
- Android4.4关于电阻屏调试和校准
- 算法时间复杂度
- 用Kotlin实现Android点击事件
- hibernate(九)注解方式的多表操作一对一和多对多
- (自定义MyBanner)小圆点设置,及viewpager图片轮播
- hdu 1875 畅通工程再续
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
- vscode emmet被覆盖,vue文件tab无法补全html标签
- HDU 6143 Killer Names【容斥定理】【排列组合】
- RxSwift样例二 NumbersViewController
- 关于Spring的69个面试问答——终极列表
- [Scala]Scala学习笔记十 模式匹配