2016-04-06 23 views
1

Şu anda bir projede Hazırda Beklet özelliğini kullanıyorum ve Çoktan Çok ilişkisi kurma konusunda sorun yaşıyorum. Sorunumun Cascade türleri ile ilgili olduğunu düşünüyorum.Birçok çağlayan türü sorunu için hazırda bekletme

Bu senaryoda bir reklam var ve her reklamda çok sayıda etiket olabilir, ancak her etiket birçok reklamla ilişkilendirilebilir.

@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH }) 
@JoinTable(name = "adMediaAdvertiserTag", 
     joinColumns = { @JoinColumn(name = "adMediaId") }, 
     inverseJoinColumns = { @JoinColumn(name = "advertiserTagId") }) 

Ve etiket varlık üzerinde ManyToMany haritalama geçerli:: reklam varlığın ManyToMany şerhleridir ben kaskad türleri ve eğer yapılandırmasına bağlı olarak iki farklı hataları görüyorum

@ManyToMany(mappedBy = "advertiserTags", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE }) 

etiketi veritabanında zaten var.

reklam üzerinde kaskad tipi içermiyorsa

PERSIST ve etiket zaten o zaman bu durum almak yok:

TransientObjectException: object references an unsaved transient instance 

Ve reklam üzerinde kaskad tipi dahil yoksa PERSIST ve etiketi zaten aldığımız mevcut mu: Bu çalışma yok edilir alabilirsiniz

PersistentObjectException: detached entity passed to persist 

tek yolu, her etiket üzerinden bir çağlayan türü ancak döngü gibi PERSIST ve oturuma kaydedin.

Bu doğru yaklaşım mı? Hazırda bekletmenin otomatik olarak halledebileceği bir yolu var mı? Bu açık değilse veya daha fazla bilgiye ihtiyacınız varsa bildirin.

GÜNCELLEME

Kurtarmam yöntemini Spring Framework ait CrudRepository nesneyi kullanan bir hizmeti kullanarak nesneleri kurtarıyorum. Çok fazla kod var, bu yüzden hepsini gönderemiyorum.

Şu anda kaydetmeye çalıştığım herhangi bir nesne için birleştirme veya kalıcı yöntem çağırmadım. Hibernate'in benim için böyle bir şeyi halledebileceği izlenimindeydim.

+0

Bazı etiketlerin bazılarının yeni olduğu ve ısrar edilmesi gerektiği yerde zaten var olabileceğini söylüyorsunuz. Eğer öyleyse, 'inat' yöntemi yerine 'birleştirmek' için bir çağrı olmamalı mı? –

+0

Evet, doğru. Bunu denedim ama yeni bir etiket eklendiğinde TransientObjectException döndürür: nesne kaydedilmemiş bir geçici örnek başvuruyor –

+0

Eğer CascadeType veya nesneyi kaydetmek için kullanılan yöntemi mi kastediyorsunuz? –

cevap

1

Kullandığınız kodu, Advert ve Tag nesnelerini devam ettirmek için ekleyebilir misiniz? (Ben sizinkine benzer inanmak) aşağıdaki kodla test edilmiş ve çalışır: Kullanıcı

User user = new User(); 
Role role = new Role(); 
role.setId("TEST_ROLE"); 
user.getRoles().add(role); 

entityManager.persist(user); 

User user2 = new User(); 
user2.getRoles().add(role); 
entityManager.persist(user2); 
System.out.println(user2.getId()); 

Ben:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) 
@JoinTable(name = "user_roles", 
     joinColumns = {@JoinColumn(name = "user_id", nullable = false, updatable = true)}, 
     inverseJoinColumns = {@JoinColumn(name = "role_id", nullable = false, updatable = true)}) 
protected List<Role> roles = new ArrayList<>(); 

ve Rolü

Ben: Yani

@ManyToMany(mappedBy="roles") 
protected List<User> users; 
+0

Cevabınız için teşekkürler, ancak bu, varolan bir etiketimiz (veya sizin durumunuzdaki rolünüz) olduğunda senaryo için çalışmayan açıklayıcı senaryolardan biriydi. Soruyu daha fazla bağlam ile güncelleyeceğim. –

+0

Sadece kalıcı yöntem çağrısını fark ettim, her yeni oluşturulan nesne için bu gerekli mi? –

+0

Evet, yeni bir Kullanıcıya devam etmesini sağlamanız gerekiyor, bu durumda, ve Role nesnesi, dolaylı olarak kaskat nedeniyle, kalıcı olacaktır. – Mustafa

İlgili konular