【发布时间】:2020-08-05 10:24:02
【问题描述】:
我想知道如何将实体存储在数据库中而不存储它的相对关系。
例如,您为公司的员工提供工作,并且您希望将新工作保存到您的数据库中。
您创建 2 个实体 Job 和 Worker 具有 OneToMany 关系(3 个或更多工人的 1 个工作)
当您将作业保存到数据库时,它具有字段:workers,并且不能为空。
问题:当你将工作保存到数据库中时,它的工人也被保存了! ( jobRepository.save(myJob)
所以每次我添加已经在我的数据库中的新工作人员时,都会再次添加(这当然会破坏应用程序,因为你不能有重复的工作人员)
我该如何解决这个问题?谢谢 !
示例:工作
@Entity
@Table(name = "job")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Job{
@Id
@Column(name = "id")
private Long id;
@OneToMany(mappedBy = "job", fetch = FetchType.EAGER)
private Set<Worker> workers;
}
示例:工人
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "workers")
public class User extends DataAudit {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "job_id", referencedColumnName = "id")
private Job job;
}
示例:在数据库中保存作业
Worker worker1 = workerService.getWorkerById(1);
Job job = new Job(1,worker1)
jobRepository.save(job)
给我一个错误----> JdbcSQLIntegrityConstraintViolationException:唯一索引或主键违规
【问题讨论】:
-
你将不得不展示你的代码。否则很难推断出你做错了什么。
-
我添加了一些示例代码 :)
-
您可以尝试的一件事是对于 Job#workers,您可以将级联设置为 ALL 以确保它正在应用诸如 UPDATE 之类的更改。
-
现在它给了我这个错误:乐观锁定失败;嵌套异常是 org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction
-
用户还是工人??
标签: java sql hibernate spring-boot jpa