如何解决如何在Spring Boot Data JPA中的@Entity之间链接外键
技术:
- MysqL 8
- spring-boot-starter-parent 2.3.3.RELEASE
- 使用spring-boot-starter-data-jpa
错误:
nested exception is org.springframework.dao.DataIntegrityViolationException: **Could not execute statement; sql [n/a]; constraint [null];**
java.sql.sqlIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`emr`.`user_detail`,CONSTRAINT `user_detail_ibfk_1` FOREIGN KEY (`id`) REFERENCES `facility` (`id`))
DDL:
create table facility
(
id INTEGER PRIMARY KEY AUTO_INCREMENT,name varchar(60),address varchar(200)
);
create table user_detail
(
id INTEGER PRIMARY KEY AUTO_INCREMENT,username varchar(20) not null unique,contactNo varchar(12),facilityId int unsigned
foreign key (id) references facility(id)
);
@Entity
@Table(name= "user_detail")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
@Column (name="contactNo")
private String contactNo;
@Column (name="facilityId")
private Integer facilityId;
//getter and setter
}
@Entity
@Table(name="facility")
public class Facility {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
}
假设facility
表有1行,其中Id=1
和name='Facility 1'
我试图在user_detail
的{{1}}表中插入一行,但收到错误消息
据我所知,无法发现facilityId=1
是facilityId
中的字段id
并假定Facility.java
列中不允许的null
值
我完全迷住了使代码理解user_detail.facilityId
是外键字段的问题。尝试了id
的某些组合,但未成功。
解决方法
该异常表明,当您尝试保存用户时,会将null保存为工具ID。
要执行此操作,您需要将Facility指定为User实体中的另一个表(您用错误的方式)。
@Entity
@Table(name= "user_detail")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
@Column (name="contactNo")
private String contactNo;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "facilityId",referencedColumnName = "id")
private Facility facility;
//getter and setter
}
根据您的要求,您需要指定关系。似乎在这里这种关系应该是一对一的,所以我将其标记为这样。
,您应该在此处使用@MapsId
annotation来从多对一或一对一关联中借用标识符。
@Entity
@Table(name= "user_detail")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@OneToOne(cascade = CascadeType.ALL)
@MapsId
private Facility facility;
//getter and setter
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。