簡體   English   中英

Spring JPA使用非常大的子數據集更新ManyToMany關系/ link_table

[英]Spring JPA updating ManyToMany relations/link_table with very large child datasets

我們有一些對象可能與成百上千個地址存在ManyToMany關系,並且正在尋找一種使用Spring JPA在我們的數據庫中對此模型進行有效建模的方法。 現在,我們有這樣的事情:

數據庫表:

優惠券:
couponId
...

地址:
addressId
地址

...

coupon_address:
businessId
addressId

實體:

Coupon.java

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long couponId;  

...  

@ManyToMany(fetch = FetchType.LAZY)  
@JoinTable(name="coupon_address", joinColumns = {  
    @JoinColumn(name="couponId") }, inverseJoinColumns={  
    @JoinColumn(name="addressId") })  
private Collection<Address> addresses;  

Address.java

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long addressId;  
...  

我們有一個存儲過程,該過程將返回最近的地址,效果很好。

問題:

  • 當我們更新優惠券的詳細信息時,我們不希望在保存到數據庫之前必須用所有地址填充優惠券對象。 如果我們不這樣做,將從鏈接表中刪除地址關系。 有沒有一種方法可以保存優惠券而不影響鏈接表?

  • 有沒有一種方法可以在鏈接表中填充條目,而不必將關聯的優惠券與整個地址集一起保存?

  • 當查詢最近的地址時,我們只希望將結果地址填充到客戶端的Coupon對象中。 由於我們使用LAZY來獲取優惠券,因此我們可以避免調用Coupon.getAddresses並手動填充地址的子集。

我不知道如何處理問題#1,也不確定#2是否足夠。 大多數時候,我們不必擔心每個優惠券都有大量地址,但是潛力確實存在。

謝謝。

  1. 那是因為您沒有更新優惠券。 更新優惠券將包括

     Coupon c = em.find(Coupon.class, id); c.setXxx(...); 

    只需執行此操作即可更新優惠券,而不是合並沒有地址的新優惠券。

  2. 不,使用您當前的設計是不可能的。 修改聯接表的內容的唯一方法是修改地址集合的內容。 但是您可以選擇將聯接表映射為一個實體,而不是使用ManyToMany。 或者,您可以使用本機查詢。
  3. 那不可能 addresses是優惠券的地址集合。 不是用於加載優惠券的某些查詢找到的地址。 如果需要優惠券地址的子集,請執行查詢以選擇地址。 不是選擇優惠券的查詢。

暫無
暫無

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

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