微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Spring Boot Data JPA中的@Entity之间链接外键

如何解决如何在Spring Boot Data JPA中的@Entity之间链接外键

技术:

  1. MysqL 8
  2. spring-boot-starter-parent 2.3.3.RELEASE
  3. 使用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)
);

java类

@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=1name='Facility 1' 我试图在user_detail的{​​{1}}表中插入一行,但收到​​错误消息

据我所知,无法发现facilityId=1facilityId中的字段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 举报,一经查实,本站将立刻删除。