【问题标题】:Hard time understanding relationship data storing using JPA (spring boot)使用 JPA(spring boot)很难理解关系数据存储
【发布时间】: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


【解决方案1】:

为避免重复的 id,请在 id 字段中添加 @GeneratedValue(strategy = GenerationType.AUTO)

祝你好运

【讨论】:

  • 谢谢,但它仍然将工作人员添加到数据库中。我不想每个新工作都有重复的工人:)
  • 您可以尝试@PrePersist@PreUpdate 并手动管理ID。
猜你喜欢
  • 2018-04-30
  • 2016-05-13
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2018-08-06
  • 2017-03-08
相关资源
最近更新 更多