2017-01-20 66 views
8

Şu anda bir sorunu (iyi bir bilinir) sahip kaldırmak sahip olmayan taraf değil.Bahar Veri DİNLENME + JPA hangi bir olduğunu <code>Spring Data JPA</code> + <code>Spring Data REST</code> (<code>Hibernate</code><code>JPA</code> olarak uygulanması) ile OneToMany koleksiyonu [sahibi değil yan]

haritalama şudur:

@Entity(name = Product.NAME) 
public class Product { 
... 
@OneToMany(mappedBy = "baseProduct", fetch = FetchType.LAZY, targetEntity = Variant.class) 
List<Variant> getVariants() { 
... 

ve diğer varyant tarafında

:

@Entity(name = Variant.NAME) 
public class Variant extends Product { 
... 
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Product.class) 
@JoinColumn(name = "baseproduct_id", referencedColumnName = "id") 
Product getBaseProduct() { 
... 
} 

sadece Spring Data JPA kullanırsanız tüm Ancak eğer Java tarafta iyi olduğunu varyant koleksiyonunu güncelleyerek "ürün" ü güncellemek ve PATCH isteğini https://localhost:8112/storefront/rest/product/21394435410197232 numaralı Yeni koleksiyon sadece (3 öğe arasından 2 olan):

{"variants":["22801810293768080","22801810293768096"]} 

Ben hiçbir istisna vs. ister ama sahibi olan tarafı olduğundan diğer tarafı hiçbir şey kalıcıdır ve tekrar eski 3 items aldık.

Ben know Ben ancak ben ne kadar büyük emin değilim bir performans ima (orada duymuş, her iki tarafın ve her yerde mappedBy kullanmayın üzerinde

@JoinColumn(name = "baseproduct_id", referencedColumnName = "id") 

ayarlayarak bunu düzeltmek anlamına @OneToMany olan 100+ varlık var) ve merak ediyorum @PreUpdate dinleyici veya başka bir şey üzerinden daha iyi bir çözüm var mı?

cevap

5

this article'da açıklandığı gibi, çift yönlü ilişkinin her iki tarafını da senkronize etmeniz ve ayrıca, artıkRemoval ve Cascade'i eklemeniz gerekir.

Yani, haritalama olur:

@OneToMany(
    mappedBy = "baseProduct", 
    fetch = FetchType.LAZY, 
    targetEntity = Variant.class 
    cascade = CascadeType.ALL, 
    orphanRemoval = true) 
List<Variant> getVariants() { 

Ve iki ekleme/kaldırma yöntemleriyle:

public void addVariant(Variant variant) { 
    getVariants().add(variant); 
    variant.setBaseProuct(this); 
} 

public void removeVariant(Variant variant) { 
    variant.setBaseProuct(null); 
    this.getVariants().remove(variant); 
} 

kaldır yöntemi için düzgün çalışması için, eşittir'i ve hashCode as explain in this article uygulamak gerekir.

+0

Teşekkürler, şu anda şu anda sadece ben kimseyi kaldırmak istemiyorum sadece "bağlantısını" kaldırmak değil yan tarafını kaldıran :) Ayrıca kasırga (lar) büyük bir hayranı değilim ve belki de eksik Bir şey ama addXXX ve removeXXX yöntemleri bir şekilde Spring Data Rest tarafından çağrılacak? – JOKe

+1

Ardından, yanlış bir eşleme var çünkü bir '@ JoinTable' belirtmediniz. Birleştirme tablonuz varsa, haritanın en iyi yolu, birleştirme tablosunu 2 '@ManyToOne' dernekleri olan bir ara varlık olarak eşlemektir. Kitabımda [High-Performance Java Persistence] (https://leanpub.com/high-performance-java-persistence) örneğim var. –