简体   繁体   English

如何使用 Hibernate 更新实体而不是将其插入数据库?

[英]How can I update an entity instead of inserting it into database using Hibernate?

For example, I have a Job entity and a worker entity.例如,我有一个 Job 实体和一个 worker 实体。 when I add new job I want to assign workers to it but instead of adding it's users to the database again ( and create duplicates ) I want to just update workers ( add jobs to them when I create a new job with worker list )当我添加新工作时,我想为其分配工作人员,而不是将其用户再次添加到数据库中(并创建重复项),我只想更新工作人员(当我使用工作人员列表创建新工作时向他们添加工作)

example:例子:

@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)
jobRepo.save(job)

The entities should be using bidirectional OneToMany association with @JoinTable:实体应该使用与@JoinTable 的双向 OneToMany 关联:

@Entity
@Table(name = "job")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Job{

  @Id
  @Column(name = "id")
  private Long id;


  @OneToMany(fetch=FetchType.LAZY)
  @JoinTable(name="job_workers", 
    joinColumns={@JoinColumn(name="job_id")},
    inverseJoinColumns={@JoinColumn(name="worker_id")}
  )
  @Cascade(org.hibernate.annotations.CascadeType.ALL)
  private Set<Worker> workers;
}

////////////////////////////////////////////////////////

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "workers")
public class User extends DataAudit {

  @Id
  private Long id;


  @ManyToOne
  @JoinTable(name="job_workers", 
    joinColumns={@JoinColumn(name="worker_id", insertable=false,updatable=false)},
    inverseJoinColumns={@JoinColumn(name="job_id", insertable=false,updatable=false)})
  private Job job;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM