簡體   English   中英

如何僅使用關聯 object 的外鍵來保存 spring 實體

[英]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...

響應。

JPARepository.getReferenceById(...);

關於“如何做到最好”(以及在哪些查詢中產生結果),我還可以非常推薦: https://vladmihalcea.com/the-best-way-to-map-a-.netomany-association-with- jpa-and-hibernate/ (其中Employer類似於PostJob類似於PostComment ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM