2009-03-21 25 views
15

JPA'da 2 tane var: Giriş ve Yorum. Giriş, iki adet Yorum nesnesi koleksiyonu içerir. NesnelerinJPA'da aynı türden 2 koleksiyon nasıl bulunur?

create table Entry_Comment (Entry_id integer not null, postMortemComments_id integer not null, pmnr integer not null, descriptionComments_id integer not null, dnr integer not null, primary key (Entry_id, dnr), unique (descriptionComments_id), unique (postMortemComments_id))

değerleri kaydetme descriptionComments_id olarak başarısız ve postMortemComments_id olamaz:

@Entity 
public class Entry { 
    ... 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @IndexColumn(base = 1, name = "dnr") 
    private List<Comment> descriptionComments = new ArrayList<Comment>(); 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @IndexColumn(base = 1, name = "pmnr") 
    private List<Comment> postMortemComments = new ArrayList<Comment>(); 

    ... 
} 

böyle nesneleri depolamak için, JPA + hazırda "Giriş" masa, masa ve TEK "Entry_Comment" "Yorum" yaratır Aynı anda "null" değil.

JPA + Hazırda Bekleme'yi kullanarak aynı türden iki koleksiyon içeren nesneyi nasıl depolarım?

cevap

13

Bu, birçok Hazırda Bekletme hatalarından biridir (HHH-3410 tam olmalıdır).

Her birinin kendi tablo adına sahip olduğu @JoinTable ek açıklamalarını @OneToMany ilişkilerine ekleyerek düzeltmeyi başarabildim.

Senin durumunda böyle görünecektir:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(name="entity_descriptioncomments") 
@IndexColumn(base = 1, name = "dnr") 
private List<Comment> descriptionComments = new ArrayList<Comment>(); 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(name="entity_postmortemcomments") 
@IndexColumn(base = 1, name = "pmnr") 
private List<Comment> postMortemComments = new ArrayList<Comment>(); 

Not: siz de @IndexColumn ek açıklama eklemek gerekir (çünkü birden EAGER torbaları ile diğer hazırda sorunun: HHH-1718/EJB-346).

+0

Ve bu ilişkiyi nasıl iki yönlü hale getiriyorsunuz? –

4

JPA'da olduğu gibi 2 koleksiyonun DataNucleus (http://www.datanucleus.org) ile saklanması için, yaptığınız gibi aynen yaparsınız. @JoinTable ek açıklığınız yoktur, dolayısıyla her bir koleksiyon için FK Comment'a yerleştirilmelidir. Gerçekte @JoinTable bir yere (veya XML eşdeğerine) sahipseniz, ilgili birleştirme tablolarının adlarını da (her koleksiyon için bir tane) ayarlamak işe yarayacaktır (böylece kendi birleştirme tabloları vardır). DataNucleus'ta da 2 koleksiyon arasında paylaşılan birleştirme tablosuna sahip olmak mümkündür, ancak standart bir JPA değil, bunun yerine bir satıcı uzantısı.

bir spec ;-)

2

sahip noktası veri modelinden mevcut eşleşmesine sahip bir kusur vardır Hiçbir fikrim, ama sonra bu JPA öylesine thats beri tutarlı olmalıdır olduğunu Hazırda eşleştiren Nasıl/görüş alanı modeli nokta: actaully bir tek@ OneToMany ilişki Giriş ila Yorum var. 'açıklama' veya 'postmortem': Ve Yorum varlık biri daha niteliği tip 2 değerlerini alır denilen olmalıdır.

Eğer (muhtemelen JPA miras özelliklerini kullanarak) ve @JoinTable açıklama içinde Girişi kullanılarak 2 farklı varlıklar içine Yorum varlık parçalayarak düşünebilirsiniz Giriş varlığın mevcut uygulaması ile satır içi olmak.

0

Tek önem verdiğiniz bir şey varsa, iki dizin sütun tanımının aynı ada sahip olması nasıl yapılandırılır?

+0

Denedim. Hazırda bekletme hala istisna atar. –

İlgili konular