2010-12-23 3 views
7

DB aşağıdaki şemayı var (basitleştirilmiş)Herhangi bir ilişki tanımlamaksızın bir alandaki bir alanı eşlemek mümkün mü?

MainTable(
    ID primary key 
    SOMEFIELD 
    CODE_FK1 -- references OtherTable1 CODE (without declared foreign key) 
    CODE_FK2 -- references OtherTable2 CODE (without declared foreign key) 
    ... Other fields used 
) 

OtherTable1(
    CODE primary key 
    LABEL 
    ... other fields not used 
) 

OtherTable2(
    CODE primary key 
    LABEL 
    ... other fields not used 
) 

doğrudan yani benim diğer tablolar olmadan gelen etiketler kullanmak için ana tablo için benim Varlığı tanımlamak için herhangi bir yolu yoktur diye soruyorum Bu diğer tablo için varlıkları tanımlamak.

Gerçekten çok korkunç olan DB şemasını değiştiremiyorum (her yerde, katları tablolarda tanımlanmış olan etiketler/kod çiftleri var). Ve eğer mümkün olsaydı, bu çözüm benim diğer kodlara gerçekten ihtiyaç duymadığımdan, kodumu basit tutar.

Ben böyle bir şey neden olur tahmin:

@Entity 
public class MainEntity{ 
    @Id 
    private Integer ID; 

    @Column(name="SOMEFIELD") 
    private String SomeField; 

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE 
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1") 
    private String Label1; 

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE 
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1") 
    private String Label1; 

} 

peşin ederek yardım!

+1

Gerçekten bu ile varlık düzeyi ilişkileri JPA (ile mümkün olduğu takdirde şüphe diğer varlıklar tanımlanmış, alanların birleşik birimlerde nasıl edinileceği değil). Bu iki seçeneği düşündünüz mü: a) tüm ilgili tabloları JPA varlıkları ile eşleştirin ve ihtiyacınız olduğunda sorgulama yapın; b) DB etkileşimi fazla değilse, hayatı kolaylaştırmak için JDBC kullanın? –

cevap

12

Diğer bir olasılık diğer tablodan değer almak için @Formula ek açıklama elde ederiz. Bu, Varlığınızı her yüklediğinizde otomatik olarak bir alt seçim oluşturur. [Hazırda docs] bu konuda çok az bilgi bulunmaktadır

@Entity 
public class MainEntity{ 
    @Id 
    private Integer ID; 

    @Column(name="SOMEFIELD") 
    private String SomeField; 

    @Formula("(SELECT ot1.LABEL FROM OtherTable1 ot1 WHERE ot1.CODE = CODE_FK_1)") 
    private String Label1; 

} 

Eğer biraz deneme yanılma gerekebilir böylece [1], (sağ olsun:

Ben böyle bir şey gerekir düşünüyorum ancak hibernate.show_sql=true ile çalışmak gerekir

Bu yaklaşıma 2 olası olumsuz yanları vardır.

  1. Bu hazırda bekleme özgü kod
  2. olduğunu
  3. Bu sade SQL ve dolayısıyla veritabanına özgü olabilir

HTH

[1]: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-property hazırda docs

+1

Man. Beni 2 saatlik çalışmadan kurtardın. Çok teşekkür ederim! –

1
+0

Öneriniz için teşekkürler, ancak büyük ölçüde denedik. Aslında, bir istisna elde ettik: org.hibernate.AnnotationException: SecondaryTable JoinColumn birincil olmayan bir anahtar başvuruda bulunamaz. Http://opensource.atlassian.com/projects/hibernate/browse/HHH-4987 adresinden Hibernate'in hata mesaj panosunda yayınlanan bir sorun buldum. – mdomenjoud

+0

O zaman JIRA’ya yorum yapmanızı tavsiye ederim. Bir test vakası vermeyi unutma :-) Aksi halde, bir sonraki versiyonda hala bir hata olacaktır. – jpkrohling

+0

Gönderi bozuk bir bağlantı içerir ... – slartidan