SORU
3 AĞUSTOS 2010, Salı


Bir-çok aynı Varlığın ilişkisi Nasıl JPA:

Bir Varlık Sınıfı var"". Bir sınıf aynı türden çocuk sahibi olabilir"". Ayrıca "Bir" eğer bir çocuk ise ana tutmak gerekir.

Bu mümkün mü? Nasıl Varlık sınıf ilişkileri göster etmeli miyim? ["Bir" kimlik sütunu vardır.]

CEVAP
3 AĞUSTOS 2010, Salı


Evet, bu mümkün. Bu standart iki yönlü ManyToOne/OneToMany ilişki özel bir durumdur. İlişki her iki ucundaki varlık aynı olduğu için özel. Genel durum JPA 2.0 spec Bölüm 2.10.2 ayrıntılı.

Burada çalışmış bir örnek. İlk olarak, varlık sınıfı A:

@Entity
public class A implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @ManyToOne
    private A parent;
    @OneToMany(mappedBy="parent")
    private Collection<A> children;

    // Getters, Setters, serialVersionUID, etc...
}

Burada üç tür varlıklar devam eden main() kaba bir yöntem:

public static void main(String[] args) {

    EntityManager em = ... // from EntityManagerFactory, injection, etc.

    em.getTransaction().begin();

    A parent   = new A();
    A son      = new A();
    A daughter = new A();

    son.setParent(parent);
    daughter.setParent(parent);
    parent.setChildren(Arrays.asList(son, daughter));

    em.persist(parent);
    em.persist(son);
    em.persist(daughter);

    em.getTransaction().commit();
}

Bu durumda, her üç varlık örneklerini işlem yapmadan kalıcı olmalıdır. Eğer bir çocuk aile ilişkisi grafikte varlıklardan biri inat için başarısız olursa, o zaman bir istisna commit() atılır. Eclipselink, bu RollbackException bir tutarsızlık detaylandırma.

Bu davranış Acascade öznitelik'nin OneToMany ve ManyToOne açıklamalar. yapılandırılabilir. Eğer bu açıklama hem cascade=CascadeType.ALL I örneğin, güvenli varlıklardan biri kalıcı ve diğerlerini göz ardı edebilirim. Benim hareket parent ısrar ettim ki. JPA uygulaması parent'CascadeType.ALL ile işaretlenmiş olduğundan 13* s *özellik. erişir JPA uygulaması son daughter bulur. O zaman açıkça bunu talep etmedim bile benim adıma hem çocuklar, devam ederse.

Bir not daha. Her zaman programcının sorumluluğu iki yönlü bir ilişki her iki güncelleme için. Bazı anne-baba için bir çocuk eklemek için zaman, diğer bir deyişle, çocuğun ana özellik buna göre güncellemek gerekir. Çift yönlü bir ilişkinin sadece bir tarafı güncellenmesi JPA altında bir hata. Her zaman ilişkileri her iki güncelleştirin. Bu JPA 2.0 spec 42 sayfasında açıkça yazılı

Not Bu uygulama ayılar sorumluluk bakımı tutarlılık çalışma ilişkileri—örneğin, sigortalanması “bir” ve “çok” tarafı bir çift yönlü ilişki vardır ile tutarlı bir uygulama güncelleştirmeleri zamanında ilişki.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • tutvid

    tutvid

    19 AĞUSTOS 2006
  • Watcher3223

    Watcher3223

    15 Kasım 2007