JPA自动建表不生成外键

本文介绍了如何在SpringBoot结合JPA时,避免一对多或多对多关系中的外键约束问题,提供单向与双向关联的解决方案,并指导如何配置@JoinColumn和@ForeignKey注解以实现无约束关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot项目搭配的JPA使用时候,有一对多的关系注解,那么自动会生成外键。外键在有些时候,会导致代码不能走通,我们不想要怎么做。有两种解决方案。

情况一:多表关系映射:一对多

1、单向一对多/多对一,在@JoinColumn内加上@ForeignKey属性配置即可

@OneToMany
@JoinColumn(name="cid",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT))

@ManyToOne
@JoinColumn(name="cid",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT))

2、双向一对多,除了在@JoinColumn加@ForeignKey配置,还需要再另一方(一方)加配置

// 一方加@org.hibernate.annotations.ForeignKey,注意:这个注解被废弃了,所以更新jar包的时候需要注意下
@org.hibernate.annotations.ForeignKey(name = “none”)
@OneToMany

// 多方配置不变
@ManyToOne
@JoinColumn(name="cid",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT))

或者

// 一方加@Transient,意思是忽略该字段,我认为加上这个字段后在加@OneToMany也无意义了.
@Transient
@OneToMany

// 多方配置不变
@ManyToOne
@JoinColumn(name="cid",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT))

情况二、多表关系映射:多对多

多对多也是类似的处理方式:

1、单向多对多:只要在@JoinTable内的@JoinColumn内加上@ForeignKey属性配置即可,记得每个表外键都要加

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="tb_student_teacher",
           joinColumns=@JoinColumn(
               name="student_id",
               referencedColumnName = "student_id",
               foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)),
           inverseJoinColumns=@JoinColumn(
               name="teacher_id",
               referencedColumnName = "teacher_id",
               foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)))

2、双向多对多:参照双向一对多/多对一,在另一方加注解即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值