Hibernate @JoinColumn 注解的用法

1、一对一单项外键

(比如实体People和实体IDCard,一个人对应一个身份证号)
@OneToOne(cascade=CAscadeType.ALL)全级联关系
@JoinColumn(name=“pid”,unique=true)被控类的外键写到主控类中,且唯一

注意:保存时应该先保存主表对象,再保存外键对象,这是因为数据库外键约束的原因。删除时则相反,应该先删除该人的身份证号,再删除该人,或者将该人和身份证号一起删除。

2、一对一双向外键

主控方配置不变
被控方添加
@OneToOne(mappedBy=“card”)myppedBy指定了把控制权利交给主控方,指定主控方所对应的外键属性card

注意:双向关联,必须设置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仍然存在于学生表中作为外键

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

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

在多方添加注解
@ManyToOne(cascade{CAscadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name=“cid”)
在一的一方添加注解
@OneToMany(cascade{CAscadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name=“cid”)

注意:这里的@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”)})

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值