2008-12-22 15 views
5

Bağlantı tablosu kullanarak çoktan çoğa Hazırda bekletme modunu eşlemek istiyorum.Bağlantı Tablo ile Hazırda Beklemedeki Çok Kütük Listesi nasıl eşlenir Harita Çizgisi

public class Parent{ 

private List<Child> _children; 

//...getters and setters 
} 

Ben üç sütun link_id, parent_id ve child_id ile bir bağlantı tablosu (link_table) kullanın: İki sınıf, örneğin Veli ve Çocuk sınıfı var. Veritabanı, SQL sunucusu ve kimlik türleri benzersiz belirleyicidir. Bu yüzden genellikle id alanları için rehber kullanırım.

Bu, doğru etiket kullanılıyorsa, bu <list /> etiketini kullanarak nasıl uygulayabilirsiniz? Bunu başarmak için iyi bir doküman biliyor musunuz?

Şu anda bir ConstraintViolationException alıyorum ancak bununla ilgili iyi bir belge veya örnek bulamadım.

Temel bir sorun olduğunu düşünüyorum: bağlantı tablosunda otomatik olarak oluşturulacak link_id belirtme.

cevap

5

mümkün (veya gerektiğinde) olduğunu sanmıyorum katılmak için link_id birincil anahtar eklemek için tablo. Birleştirme tablosu genellikle iki katılımcı tablonun birincil anahtarlarından oluşur.

böyle sözdizimi gerekir XML kullanma:

<class name="Parent"> 
    .... 
    <list name="children" table="link_table"> 
    <key column="parent_id"/> 
    <many-to-many column="child_id" 
     class="Children"/> 
    </list> 
    ... 
</class> 

<class name="Child"> 
... 
<list name="parents" inverse="true" table="link_table"> 
    <key column="child_id"/> 
    <many-to-many column="parent_id" 
     class="Parent"/> 
</list> 
... 
</class> 

rağmen ben kullanmak ek açıklamaları daha iyi buluyorum.

+5

Bu da inanıyorum bir dizin sütunu gerektirir. – Brandon

+0

Gerekli güçlü bir kelimedir. Bazılarının endekssiz olarak kötü performans göstermesiyle sonuçlanabilirsiniz, ancak indeksin * gerekli * olduğunu düşünemiyorum. – corsiKa

+2

"dizin sütunu", bu bağlamdaki bir veritabanı dizininden çok farklıdır. – araqnid

0

Mevcut verilerle mevcut bir veritabanı için bunu kolayca çekebileceğinizden emin değilim. Hazırda

Sadece çıkardı ettik ... kapalı kendi veri şeması ilk defa bağlantı tanımlayan genellikle daha iyidir birçok çoğa ek açıklamalarla ama hazırda belgelerine XML tabanlı örnekler sunmaktadır düşünüyorum: link text

7

yapmam bu kullanarak ek açıklamalar, özellikle @ManyToMany ve @JoinTable:

Hibernate Docs:

@Entity 
public class Employer implements Serializable { 
    @ManyToMany(
     targetEntity=org.hibernate.test.metadata.manytomany.Employee.class, 
     cascade={CascadeType.PERSIST, CascadeType.MERGE} 
    ) 
    @JoinTable(
     name="EMPLOYER_EMPLOYEE", 
     [email protected](name="EMPER_ID"), 
     [email protected](name="EMPEE_ID") 
    ) 
    public Collection getEmployees() { 
     return employees; 
    } 
} 


@Entity 
public class Employee implements Serializable { 
    @ManyToMany(
     cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
     mappedBy = "employees", 
     targetEntity = Employer.class 
    ) 
    public Collection getEmployers() { 
     return employers; 
    } 
} 
+0

büyük bir yanıt, çok yardımcı oldu –

0

Çok sayıda eşlenmiş hazırda bekletilen sütuna ek alanlar eklemenin iki yolunu sunan çevrimiçi çok iyi bir blog buldum. Geleneksel olarak, pek çok haritalamadan, tablodaki FK tablolarının yeni bir tablo vermesini bekliyoruz. Ancak, bu birleştirilmiş tabloya daha fazla alan/sütun ekleyip bunları ekleme yolları vardır.

Bu eklenmiş masa bir PK içerebilir veya PK içermeyen bazı ek alanlar içerebilir.

Ve yeni tablo ParentChildren beyan ve linkid olarak birincil anahtar beyan böylece örneğin göre, tabloda fazladan PK gereken tam uygulanması See Here için bu blogu bakın. Ebeveynlerde çok sayıda eşleme için ek açıklama olarak, sadece üst açılı parentchildren sınıfını gösteriyorum ve alt sınıftan üst sınıftan referans alınabilir.

@Entity 
@Table(name = "parent_children") 
public class ParentChildren{ 
    @Id @GeneratedValue 
    private long linkId; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "children_id) 
    private Children children; 

    // additional fields if you want 
    private boolean activated; 

    //getters and setters 
    } 
} 

Yani bu yabancı anahtar olarak birincil anahtar ve PARENT_ID ve children_id olarak linkid bir eşleme tablosunu oluşturur. Sadece bir link_id'i neden birincil anahtar olarak ve nasıl kullanacağınızı açık olarak belirtin.

İlgili konular