2010-05-20 11 views
5

Tasarımdan çok, uygulamadan daha fazlası olan bir sorum var. Ayrıca, herkesin cevabın kaynağını göstermesi için de mutluyum ve memnuniyetle, kendim için araştırmam. Java Etki Alanı nesnelerini Tablolara eşleme (Hazırda Bekletme'yi kullanarak) iyi tasarım

Üç özelliklere sahip 'Resim' adlı bir iş alanı POJO olduğunu varsayalım:

yüksek Java ve SQL basitleştirilmiş.
class Picture 
    int idPicture 
    String fileName 
    long size 

Bunlar normal basit bir ilişki olacağını ben 3 özellik

class Item 
    int idItem 
    String itemName 
    ArrayList<Picture> itemPictures 

ile "Öğe" adlı başka bir iş alanı POJO olduğunu düşünelim. 'Resim' nesnesinin, 'un 'Öğe' nesnesinin dışında bulunmayacağını söyleyebilirsiniz. Bir resim sadece belirli bir öğeyi aittir varsayalım, ama bir öğe Şimdi birden fazla resim

olabilir - iyi bir veritabanı tasarımı (3 Normal Form) kullanarak, biz öğeleri ve kendi tablolarda resim koymak gerektiğini biliyoruz. İşte doğru olduğunu varsayalım. Bu nesneler için hazırda eşleme dosyaları yapıyorsanız :

table Item 
    int idItem (primary key) 
    String itemName 

table Picture 
    int idPicture (primary key) 
    varchar(45) fileName 
    long size 
    int idItem (foreign key) 

İşte benim sorudur. Veri tasarımında, Resim tablonuzun Öğeye başvurmak için bir sütuna ihtiyacı vardır, böylece bir yabancı anahtar ilişkisi korunabilir. Ancak, iş etki alanı nesnelerinizde - Picture nesnesiniz, Öğenin IDI'sine bir başvuru/özniteliği tutmaz ve bunu bilmesi gerekmez. Bir java Picture örneği, bir Item örneğinin içinde her zaman örneğidir. Görüntünün ürününe ait olduğunu öğrenmek istiyorsanız, doğru kapsamdasınız. MyItem.getIdItem() ve myItem.getItemPictures() yöntemini çağırın ve ihtiyacınız olan iki bilgi parçanıza sahip olursunuz.

Hazırda bekletme araçlarının POJO'larınızı otomatik olarak veritabanınıza bakmasını sağlayan bir jeneratöre sahip olduğunu biliyorum. Sorunum, ilk olarak bu deneme/projesinin veri tasarımını planladığımdan kaynaklanıyor. Daha sonra, alan java nesnelerini yapmaya gittiğimde, iyi tasarımın nesnelerin yuvalanmış bir şekilde diğer nesneleri tuttuğunu belirlediğini fark ettim. Bu, bir veritabanı şemasının - tüm nesnelerin (tabloların) düz ve bunların içinde başka hiçbir karmaşık tür barındırmaması şeklinden farklı olarak açıktır. Bunu uzlaştırmanın iyi bir yolu nedir?

sen misin:

(A) Picture.hbm.xml POJO ebeveynin idItem Field bir eşleme vardır ki (hatta mümkünse) hazırda eşleme dosyaları olun

(B) Ekle Resim sınıfında bir int özniteliği idItem'e başvurmak ve örneklemede ayarlamak, böylece tüm tablo alanlarını sınıfındaki yerel öznitelikler olarak göstererek hbm.xml eşleme dosyasının basitleştirilmesi (C) yanlış, Dork.

Ben size Picture varken hep Item sahip olacağını söylediği gibi gerçekten, onun Item başvurmak Picture şey gerekmez geliyor bana herhangi bir geri bildirim

+0

@M. McKenzie, cevaplarımız hakkında bize bir geri bildirim verecek misin? –

cevap

3

takdir gerçekten olur.

Ancak bu başvuruya gerçekten ihtiyacınız olduğu ortaya çıkıyorsa, bu durumda çift yönlü bire-çok ilişkisi olan'un kurulması durumudur.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html

Örnek:

<class name="Item"> 
    <id name="id" column="item_id"/> 
    .... 
    <set name="pictures" inverse="true"> 
     <key column="item_id"/> 
     <one-to-many class="Picture"/> 
    </set> 
</class> 

<class name="Picture"> 
    <id name="id" column="picture_id"/> 
    .... 
    <many-to-one name="item" 
     class="Item" 
     column="item_id" 
     not-null="true"/> 
</class> 
+0

Çok teşekkür ederim, geç cevaplama için özür dilerim. Gavin King'in kitabını bir arkadaştan ödünç aldım ve bu kavramı çok fazla temizleyen koleksiyonlardaki bölümleri okudum. –

0

Resmini tablo öğesi tablosunda bir başvuru tutmak için değiştirilmesi gerekir, o zaman saklayabilir

bu burada nasıl yapıldığını görün öğelerin birden fazla resmi.

Hazırda bekletme eşlemesi için, bağımlı nesnelerin (resimler) ana nesnenin (Öğe) hbm dosyasında bir eşlemesini eşleyebilirsiniz. Buna bileşen eşlemesi denir.

Sen hazırda kılavuzuna bakabilirsiniz: Ben bu işin arkasında xml yapılandırması hakkında emin değilim, ama ek açıklamaları kullanarak sadece böyle bir şey (JPA 2.0) yapabilirsiniz

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html#components-incollections

+0

Hazırda bekletme kılavuzunu kontrol edebilirsiniz: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html#components-incollections – Gala101

0

:


@Embeddable 
class Picture 
    int id 
    String filename 
    long size 

class Item 
    int idItem 
    String itemName 

    @ElementCollection 
    @CollectionTable(name = "item_picture", joinColumns = @JoinColumn(name = "item_id")) 
    List<Picture> pictures 
+0

Bu son derece ilginç ve basit! Sadece Hazırda Bekletme uygulamasını kullanmayı ve daha sonra ek açıklama yeteneklerini araştırmayı planladım - ama şimdi bununla ilgileniyorum. Çok teşekkür ederim! –

0

Derneğin başka özellikleri var mı? Tarihler, durumlar vb. ,

table Item 
    int idItem (primary key) 
    String itemName 

table Picture 
    int idPicture (primary key) 
    varchar(45) fileName 
    long size 

table ItemPictureAssociation 
    int idItem (foreign key) 
    int idPicture (foreign key) 
    int sequence (composite PK) 
    <other columns> 

bir bire çok ilişki koruyabilirsiniz Bu şekilde kendi ayrıntılar ayrı iki nesne tutmak ve gerektiğinde ilişkinin özelliklerini korumak: Öyleyse, olarak modellemek olacaktır.

İlgili konular