美文网首页
HIberiante注解(二)

HIberiante注解(二)

作者: 最最最最醉人 | 来源:发表于2018-01-19 15:43 被阅读9次

关系映射级别注解

一对一单向外键

  • @OneToOne(cascade=CascadeType.ALL)
  • @JoinColumn(name="pid", unique=true)

@OneToOne(cascade=)
表示级联关系
@JoinColumn(name="pid", unique=true)
表示外键关联, 对应关联类的列名

这里我们以学生和身份证号为模型,一个身份证号可以唯一的对应一个学生,一个学生有一个唯一的身份证号

@Entity
public class IDCard {

    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid", strategy="assigned")
    @Column(length=18)
    private String pid;     // 身份证号码
    private String sname;   // 学生的姓名
}
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private Date birthday;
    
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="pid", unique=true)
    private IDCard idCard;
}

因为是Student中有一个指向IDCard表主键的字段pid,所以主控方是Student,所谓主控方就是能改变关联关系的一方,Student只要改变pid就改变了关联关系

一对一双向外键

  1. 主控方的配置同一对一单向外键关联
  2. @OneToOne(mappedBy="idCard") // 被控方

mappedBy中的属性是,主控方中外键的属性。
双向关联,必须设置mappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双发都无法保存。

@Entity
public class IDCard {

    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid", strategy="assigned")
    @Column(name = "pid", length=18)
    private String pid;     // 身份证号码
    private String sname;   // 学生的姓名
    
    @OneToOne(mappedBy="idCard")
    private Student student;
}

Student和上面一样没有任何改变

多对一单向外键

多方持有一方的引用, 比如:多个学生对应一个班级

@ManyToOne(cascade={CascadeType.All}, fetch=FetchType.EAGER)
fetch: 抓取策略。

@JoinColumn(name="cid", referencedColumnName="id")
name:多方外键的列名
referencedColumnName:一方主键的列名

/**
 * 教室,一的一方
 * @author whyalwaysmea
 */
@Entity
public class ClassRoom {

    @Id
    @Column(name="id")
    @GeneratedValue(generator="cid")
    @GenericGenerator(name="cid", strategy="uuid")
    private String classRoomId;
    
    private String classRoomName;

}
/**
 * 学生类,多的一方
 * @author whyalwaysmea
 */
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private String sname;
    
    @ManyToOne(cascade= {CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinColumn(name="cid", referencedColumnName="id")
    private ClassRoom classRoom;
}

一对多单向外键

一方持有多方的集合,一个班级有多个学生

@OneToMany(cascade={CascadeType.All}, fetch=FetchType.LAZY)
@JoinColumn(name="cid")

多对多单向外键

学生和教师构成多对多的关联关系
其中一个多方持有另一个多方的集合对象(学生持有教室的集合)
创建中间表

@Entity
public class Teacher {

    @Id
    @GeneratedValue(generator="tid")
    @GenericGenerator(name="tid", strategy="uuid")
    private String tid;
    
    private String tname;
}
@Entity
public class Student {

    @Id
    @GeneratedValue(generator="sid")
    @GenericGenerator(name="sid", strategy="uuid")
    private String sid;
    
    private String sname;
    
    @ManyToMany
    @JoinTable(name = "teachers_students", 
            inverseJoinColumns = {@JoinColumn(name = "teacherId", referencedColumnName="tid")},
                    joinColumns = {@JoinColumn(name = "studentId", referencedColumnName="sid")} 
    )
    private Set<Teacher> teachers = new HashSet<>();
}

参考

代码下载
Hibernate注解

相关文章

  • HIberiante注解(二)

    关系映射级别注解 一对一单向外键 @OneToOne(cascade=CascadeType.ALL) @Join...

  • 框架注解解析

    一,通用注解 二,Spring 三,mybatis/mybatis-plus注解 四,hibernate注解

  • 注解基础

    一、注解的声明 1.所有注解,默认实现Annotation接口 2.注解的声明 二、元注解 元注解为对注解类型进行...

  • Java-Java注解(Annotation)

    一.内置注解 1.元注解(用于修饰注解定义) 2.原生注解 二.自定义注解(例) 1.定义注解 2.使用注解 3....

  • HAP_接口监控(注解)

    方法一:注解: 新建注解接口: 新建切面类监听注解接口: 给方法添加新建的注解: 测试: 方法二:(非注解)对IS...

  • Spring Boot 注解大全

    一、注解 (annotations) 列表 二、注解 (annotations) 详解@SpringBootApp...

  • JAVA注解的使用

    参考文章 注解的定义: 一、定义注解 1.使用@interface2.元注解 注:注解类不支持继承 二、元注解 三...

  • Java注解

    概念 使用 一、创建一个注解 二、元注解 @Retention 注解的有效期 @Target 注解运用的地方 @...

  • Android注解

    本文目录: 一. 注解概念和介绍 二. 注解的语法 三. 基本注解——五大元注解 四. AnnotatedElem...

  • Java一注解全面分析

    目录 一、为什么要学习注解呢? 二、什么是注解(Annotation) 三、注解有什么作用 四、注解的分类 五、注...

网友评论

      本文标题:HIberiante注解(二)

      本文链接:https://www.haomeiwen.com/subject/buaooxtx.html