hibernate关联映射注解

来源:CSDN 浏览量:183 发布时间:2018-12-27 20:59:47

1、一对一单项外键(比如实体People和实体IDCard,一个人对应一个身份证号,反之)

@OneToOne(cascade=CAscadeType.ALL)全级联关系

@JoinColumn(name="pid",unique=true)被控类的外键写到主控类中,且唯一

ps:保存时应该先保存外键对象,再保存主表对象,这是因为数据库相关约束的原因


2、一对一双向外键

主控方配置不变

被控方添加

@OneToOne(mappedBy="card")myppedBy指定了把控制权利交给主控方,指定主控方所对应的外键属性card

ps:双向关联,必须设置mappedBy属性,因为双向关联只能交给一方去控制,不可能双方都设置外键保存关联关系,否则双方都无法保存


3、多对一单向外键(如多个学生对应一个班级)

在多方添加注解

@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)

EAGER表示迫切的加载

@JoinColumn(name="cid",referencedColumnName="CID")JoinColumn在此处表示多方持有一方的引用,一方的外键用name表示,referencedColumnName表示如果这个外键映射到数据库中作为属性给它起的别名


4、一对多单向外键(如一个班级有多个学生)

在一的一方添加注解,一方持有多方的一个集合

@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)

@JoinColumn(name="cid")cid仍然存在于学生表中作为外键

ps:FetchType的抓取数据策略,如果是多对一,多的一方通常设置为EAGER,一对多,一的一方通常设置为LAZY


5、一对多(多对一)双向外键

在多方添加注解

@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)

@JoinColumn(name="cid")

在一的一方添加注解

@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)

@JoinColumn(name="cid")

ps:这里的@JoinColumn可能不太好理解,但你仔细想想(假设对象为学生和班级),每个学生都可以有一个cid属性作为他的外键,表示他属于哪个班级,但不可能班级表里面有sid,因为一个班级可能有多个学生,这就导致sid不能只有一个,这将破坏外键的唯一性


6、多对多单向外键

其中一个多方持有另一个多方的集合对象(如学生持有老师的集合)

学生和老师之间的外键关系的维护需要通过中间表来完成

注解

@ManyToMany

@JoinTable(name="teachers_students",JoinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})

Jointable注解可以生成中间表,JoinColumns和inverseJoinColumns指定了相应的控制字段


7、多对多双向外键

双方都持有对方的集合,其中一方设置

如教师类

@ManyToMany(mappedBy="teachers")将主控方交给学生

学生类

@ManyToMany

@JoinTable(name="teachers_students",JoinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})

--------------------- 

作者:JokerZhan 

来源:CSDN 

原文:https://blog.csdn.net/JokerZhan/article/details/85014806