Jpa

2012-11-07 11 views
5

numaralı bilgisayarda ikincil tabloda ayrımcı sütunu bulundurmak mümkün mü Şu anda var olan bir db şemasını jpa öğelerine eşlemekle uğraşıyorum ve çok fazla tuhaflık arasında, bu sorun üzerinde sıkışıp kaldım.Jpa

Buna benzer iki tablo var:

tablo 1'de servicetype tabloda iki hizmet türü için yabancı anahtar olduğunu
Table 1   Table 2   
|Service  | |Servicetype  | 
|servicetype | |Servicecategory | 
|   | |    | 

. Ancak, tablo 1'deki hizmetler, hangi kategoriye ait olduklarına göre çok farklı bir davranışa sahiptir (100'den fazla hizmet birimi vardır, yalnızca 4 kategori vardır) Tablo 1'i eşleyebilmek istiyorum. Hizmet türlerinin kategorisine göre dört farklı varlık sınıfı. çalışmayan bir farklı discriminatorvalue ile, bundan buth uzanan

@Entity 
@Table(name = "table1") 
@DiscriminatorColumn(name = "servicecategory", discriminatorType =   
    discriminatorType.INTEGER) 
@DiscriminatorValue("1") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@SecondaryTable(name = "table2", 
pkJoinColumns = 
@PrimaryKeyJoinColumn(name = "servicetype", referencedColumnName = 
"servicetype")) 
public class AbstractService implements Serializable { 
...etc 

Ve 4 sınıfları, EclipseLink beri kullanıyorum, hangi arama çalışır:

Bu

Bugüne kadar ne var Tablo 1'de hizmetkategorinin değeri.

Jpa ile böyle bir eşleştirmeyi ifade etmek mümkün mü yoksa her sorguda "where servicecategory = ?" ile eşleştirmeyi yapmalı mıyım?

+0

Tanımdaki tablo ve sütun adını belirtmeyi denediniz mi? "table2.servicecategory" – Chris

+0

Diskriminatorcolumn ek açıklamada? Evet. Ancak oluşturulan sorgu zaten bir takma ad ile tabloyu belirtir, bu yüzden sadece cevabınız için teşekkürler tablealias.table2.servicecategory – vruum

cevap

1

Lütfen bu özellik için destek eklemek üzere EclipseLink'te bir geliştirme yapın. Bir JPA çözümü, birincil tabloyu ikincil tabloyla değiştirmek olabilir - bu, ekleme siparişinde sorunlara neden olabilir ve yabancı anahtarlar, Tablo2'deki Servicetype öğesine başvuruda bulunacaktır.

EclipseLink'e özgü bir çözüm, ayıklama alanı için kullanılan tabloyu değiştirmek için bir özelleştirici kullanmaktır. @Customizer etiketini varlığa ekleyin ve bir yöntemle bir sınıf belirtin:

public void customize(ClassDescriptor descriptor) { 
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
     descriptor.getTable("table2")); 
} 
+1

olur. 'Customizer' etiketi oldukça kullanışlı görünüyor, ancak standart hazırda kalmaya çalışıyoruz, zaten hazırda bekletiliyor ve sağlayıcıya özel şeyler tarafından ısırıldı. Gelecekte referans olarak, sadece birleştirilmiş bir tablo olduğu için, eklenen servicecategory ile bir görünüm oluşturmayı ve ekleme işlemini ayrı ayrı ele almayı başardım. – vruum