2016-03-31 24 views
1

:Özet bir sınıf içeren bir JPA çift yönlü ilişki nasıl eşlenir? Aşağıdaki basit bir şema varsayarsak

Varlık tablo - bazı varlıklar bu

entityId, commentId, commentText,.... 

Kişinin bir koleksiyonu var - tüm varlıklar

entityId, timeCreated,... 

Yorumlar tablo ortak nitelikleri tablo.

pensonId (entityId), firstName, lastName,... 

Ve aşağıdaki Java miras yapısı:

BaseEntity - abstract - entity, join inheritance with a discriminator 
    CommentedEntity - abstract - introduces `comments` collection - mapping tbd 
     Person - concrete - entity - mapping trivial 

nasıl CommentedEntity ve Comment arasındaki iki yönlü ilişkiyi map ki? Aşağıdaki kod, bulduğum örneklerin en iyi yorumudur.

CommentedEntity CommentedEntity yana

@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name="entityId", referencedColumnName="entityId") 
private CommentedEntity owner; 
  • soyut sınıftır

    @OneToMany(mappedBy="owner", fetch=FetchType.EAGER) 
    private List<Comment> comments = new ArrayList<>(); 
    

    Comment, bu işe yaramaz. owner, bilinmeyen bir varlığı işaret eder.

  • CommentedEntity öğesinin bir varlığı, bir kimlik vermenizi gerektirir, bu yüzden anlamını kullanmaz.
  • Birden çok somut varlık, comments koleksiyonuna sahip olduğundan, beton varlık adı eşlemede kullanılamaz.

Daha sonra bir person.commentList özelliğini iki yönlü olarak nasıl eşleriz?

+0

__Comment__ yazarken __Person__ genelinde bir OneToMany var, ancak bu türün ne olduğu hakkında bir fikir yok. __CommentedEntity__ için __CommentedEntity__ içinde bir ManyToOne var ?! (__Person__ demek istediniz?) Alan türleri tutarlı olduğu ve persistabl olduğu sürece (Varlık veya MappedSuperclass) o zaman bu http: // gibi bunu (veya kullandığım uygulama ile en azından ben yapabilirim) yapabilmeniz gerekir. www.datanucleus.org/products/accessplatform_4_2/jpa/orm/one_to_many_collection.html#join_bi –

+0

Üzgünüz, Neil. Çok daha basit bir örnek oluşturmalıydım ve bir hata yaptım. Soru, "CommentedEntity" ve "Comment" arasındaki çift yönlü haritalama ile ilgilidir. Bu haritalamayı ebeveyninden miras alacağı için 'Kişi' oyunda değil. Karışıklık için özür dilerim. – jacekn

+0

Sağladığınız bağlantıya baktım. Davam, FK ile Hesap/Adres gibi. “Hesap” somutu kullandığınız yerde, soyut bir 'CommentedEntity' yazmam gerekecek. – jacekn

cevap

0

Person Eğer CommentedEntity o zaman Person is part of a CommentedEntity` çünkü Person varlık için bir CommentedEntityowner gerek olmazdı uzanır. Diğer bir deyişle, bir Kişi bir Yorum Alanına ihtiyaç duymadığı için bir alan alanına ihtiyaç yoktur.

+0

Ancak iki yönlü bir eşleme, bir sahip gerektirir. 'MappedBy = "sahibi"'. Bunu nasıl belirleyeceğinize dair bir örnek verebilir misiniz? – jacekn

+0

Tanımladığınız şekilde iki yönlü bir eşleme yok. Bu sadece bir varlıktır; 'BaseEntity' alt sınıfı olan 'CommentedEntity' alt sınıfı olan 'Person'. "Kişiler" koleksiyonuna sahip olan nedir? –

İlgili konular