[英]How to save spring entities solely using the foreign key of an associated object
我有兩個 spring 實體,工作和雇主,它們具有雙向關聯。
工作實體
@Entity
@Table(name = "job")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Job {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "job_id", nullable = false)
private Integer id;
@Column(name = "title", nullable = false)
private String title;
@ManyToOne(optional = false)
@JoinColumn(name = "employer_employer_id", nullable = false)
@JsonBackReference
private Employer employer;
}
雇主實體
@Entity
@Table(name = "employer")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Employer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "employer_id", nullable = false)
private Integer employerId;
@Column(name = "name", nullable = false)
private String name;
//Mapped by indicates the inverse side of the relationship.
@OneToMany(mappedBy = "employer", orphanRemoval = true)
@JsonManagedReference
private List<Job> jobs = new ArrayList<>();
}
我還有兩個簡單的 CRUD 存儲庫
假設我在數據庫中保存了一個現有雇主 object。 在我的工作服務中,我想要一種創建新工作的方法。 我的問題是,在數據庫中保存新工作條目的正確 Spring 引導方式是什么,其中員工 ID 外鍵與數據庫中的現有工作相關。
這是我的第一次嘗試,它確實有效,但似乎效率不高。 為什么我必須從數據庫中檢索整個雇主 object,而我真的只想指定我要保存的工作的雇主 ID? 有沒有一種方法可以避免進行這種額外的數據庫調用,並且當我們將工作保存到數據庫時,只需輕松地為我們保存到數據庫的新工作指定現有雇主 ID 即可? 還是必須在此處保存整個員工 object 的 Spring 最佳實踐,即使它已經存在?
Employer e = employerRepository.findById(0).orElseThrow(IllegalArgumentException::new);
job1.setEmployer(e);
jobRepository.save(job1);
最好的方法是使用 getOne 這樣您甚至不必獲取雇主
Employer e = employerRepository.getOne(id);
job1.setEmployer(e);
jobRepository.save(job1);
如果雇主不存在,則在您保存工作時將拋出異常。
getOne 在 jpa 的更高版本中已被棄用,因此請改用它
JpaRepository#getReferenceById(ID)
好/進步的問題:
為什么我必須從數據庫中檢索整個雇主 object,而我真的只想指定我要保存的工作的雇主 ID?
我們不必: 我們可以:
Employer empler =
entityManager.getReference(Employer.class, 0L);
// handle exception...
響應。 與spring-data :
JPARepository.getReferenceById(...);
關於“如何做到最好”(以及在哪些查詢中產生結果),我還可以非常推薦: https://vladmihalcea.com/the-best-way-to-map-a-.netomany-association-with- jpa-and-hibernate/ (其中Employer
類似於Post
, Job
類似於PostComment
;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.