【问题标题】:Spring boot Post request not saving foreign keySpring Boot Post请求不保存外键
【发布时间】:2021-03-02 16:44:20
【问题描述】:

我有实体 Job 和 worker。 Worker 可以有多个 Jobs

@Entity
public class Worker {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int workerId;
    
    @Column(unique = true)
    private String name;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "worker", fetch = FetchType.LAZY)
    private List<Job> jobs;

    public int getWorkerId()
    {
        return workerId;
    }

    public void setWorkerId(int aInWorkerId)
    {
        workerId = aInWorkerId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Job> getJobs() {
        return jobs;
    }

    public void setJobs(List<Job> jobs) {
        this.jobs = jobs;
    }

    @Override
    public String toString() {
        return "Worker [id=" + workerId + ", name=" + name + ", jobs=" + jobs + "]";
    }   
}

@Entity
public class Job 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;
    
    private String description;
    
    @Enumerated(EnumType.STRING)
    private Status status = Status.CLOSE;
    
    @ManyToOne
    @JoinColumn(name="worker_id")
    private Worker worker;
    
    @Column(name="creation_time")
    @CreationTimestamp
    private Timestamp creationTime;
    
    @Column(name="last_update_time")
    @UpdateTimestamp
    private Timestamp lastUpdateTime;
    
    @Column(name="expiration_time")
    private Timestamp expirationTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public Worker getWorker() {
        return worker;
    }

    public void setWorker(Worker worker) {
        this.worker = worker;
    }

    public Timestamp getCreationTime() {
        return creationTime;
    }

    public void setCreationTime(Timestamp creationTime) {
        this.creationTime = creationTime;
    }

    public Timestamp getLastUpdateTime() {
        return lastUpdateTime;
    }

    public void setLastUpdateTime(Timestamp lastUpdateTime) {
        this.lastUpdateTime = lastUpdateTime;
    }

    public Timestamp getExpirationTime() {
        return expirationTime;
    }

    public void setExpirationTime(Timestamp expirationTime) {
        this.expirationTime = expirationTime;
    }

    @Override
    public String toString() {
        return "Job [id=" + id + ", name=" + name + ", description="
                + description + ", status=" + status + ", worker=" + worker
                + ", creationTime=" + creationTime + ", lastUpdateTime="
                + lastUpdateTime + ", expirationTime=" + expirationTime + "]";
    }
}

我正在使用 Spring data rest 和 Spring data jpa,而我的数据库 sql 脚本是

CREATE TABLE `job` (
  `id` int NOT NULL AUTO_INCREMENT,
  `creation_time` datetime(6) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `expiration_time` datetime(6) DEFAULT NULL,
  `last_update_time` datetime(6) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `worker_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKjdvw5xn9ojaarulg2lh2yrpih` (`worker_id`),
  CONSTRAINT `FKjdvw5xn9ojaarulg2lh2yrpih` FOREIGN KEY (`worker_id`) REFERENCES `worker` (`worker_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `worker` (
  `worker_id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`worker_id`),
  UNIQUE KEY `UK_2r1ixytxcsbyy8korfyf3ylgd` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

使用邮递员,我先创建了Worker

{
    "name": "ankit"
}

然后我正在创建工作

{
    "name": "job1",
    "description": null,
    "status": "CLOSE",
    "worker": {
        "workerId" : 1
    }
}

我面临的问题是 workerId 值被忽略并且为空。它正在降低它的价值。可能是什么原因。我是否未能配置双向 oneToMany 关系。 以下是worker_id为null的日志

insert into job (creation_time, description, expiration_time, last_update_time, name, status, worker_id) values (?, ?, ?, ?, ?, ?, ?)
2020-11-19 15:31:28.026 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [TIMESTAMP] - [2020-11-19 15:31:28.002]
2020-11-19 15:31:28.028 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [null]
2020-11-19 15:31:28.028 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [TIMESTAMP] - [null]
2020-11-19 15:31:28.028 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [TIMESTAMP] - [2020-11-19 15:31:28.002]
2020-11-19 15:31:28.028 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [VARCHAR] - [job1]
2020-11-19 15:31:28.028 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [6] as [VARCHAR] - [CLOSE]
2020-11-19 15:31:28.029 TRACE 10320 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [7] as [INTEGER] - [null]

【问题讨论】:

    标签: spring-boot hibernate spring-data-jpa spring-data-rest


    【解决方案1】:

    您必须使用worker 的绝对URI 并避免包装worker id。发布请求的正文应如下所示:

    {
       "name":"job1",
       "description":null,
       "status":"CLOSE",
       "worker":"http://localhost:8080/workers/1"
    }
    

    这里是 Spring 引导控制台输出(在复制时我省略了我不知道的类的字段):

    Hibernate: insert into job (id, description, name, worker_id) values (null, ?, ?, ?)
    2020-12-11 17:38:02.581 TRACE 6269 --- [nio-8080-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [null]
    2020-12-11 17:38:02.581 TRACE 6269 --- [nio-8080-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [job1]
    2020-12-11 17:38:02.581 TRACE 6269 --- [nio-8080-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [INTEGER] - [1]
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2020-05-23
      • 2017-08-10
      • 2016-04-06
      • 2018-06-03
      • 2020-03-31
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多