2009-05-27 13 views
7

Nesne türde bir dizi olabilir bir alan içeren bir nesne vardır. Bu nesne, alanın alt türleri için bir ayrımcı sütunuyla tek bir tabloda kodlanmıştır. Bu alt türlerin her biri, alanları üst nesneler tablosunda bir sütuna eşlenmiş olur. Bunu hazırda beklemede göremiyorum. Kod feryat, tablodaki alt tip verilere bakılmaksızın getSubfield() için null değerini döndürür.hazırda Yerleştirilebilir Kalıtım

Şema

 
    id type whosit whatsit 
+----+------+--------+---------+ 
| 1 | "A" | "test" | null | 
| 2 | "B" | null | "test" | 
+----+------+--------+---------+ 

Alan

@Entity 
public class Parent { 
    protected @Id @GeneratedValue int id; 
    protected Subfield subfield; 

    public Subfield getSubfield() {return subfield;} 
} 


@Embeddable 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Subfield {} 


@DiscriminatorValue("A") 
public class TypeA extends Subfield { 
    public String whosit; 
} 


@DiscriminatorValue("B") 
public class TypeB extends Subfield { 
    public String whatsit; 
} 

o possib

{id=1,subfield=null} 
{id=2,subfield=null} 

mi "üst p DAN SEÇİMİ s" Nesneleri le bu nesne modeliyle ne yapmak istediğimi ya da biraz daha yaratıcı olmamız gerekiyor (bu şema tercih edilmeyen eski bir veritabanıdır)

+1

İş yerinde çalışan bir meslektaşım beni http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910 adresine yönlendirdi. Sanırım desteklenmiyor = \ –

cevap

3

Tamam, şemayı kolayca değiştiremezsiniz, ancak Birkaç görüş eklemeye ne dersin?

+1

İyi fikir, ne yazık ki, veritabanı yapısında hala bir değişiklik. Bunu kodla çözmeye çalışıyorum, eğer başka bir şey yoksa, hazırda bekletebileceğim bir şey gibi görünüyor ve yanlış yaptığım şey hakkında merak ediyorum. –

+1

+1 yorumunuza ve bazen de bunu hatırlatarak, "doğru yap" ve kötü şema tasarımlarını düzeltemeyiz. :-) – cbmeeks

5

Asker tarafından işaret edildiği gibi, hazırda bekleme, gömülebilir sınıfların kalıtımını desteklemez (https://hibernate.atlassian.net/browse/HHH-1910).

Eclipse wiki'ye göre, JPA bu davranışı belirtmez, ancak EclipseLink bunu desteklemektedir (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance).

Benim önerim, sınıf hiyerarşisini tamamen Subfield içinde parçalamak. Korkunç, ama çözülene kadar çalışmalı.

1

Bu eski olduğunu biliyoruz.

Bunun bir yolu yukarıda belirtildiği gibidir. Bir görünüm oluştur. Şemayı değiştirmek istemediğini söylüyorsun. Öyleyse yapma. Eski şemayı eşleştiren ve istediğiniz şeyi yapan yeni bir şema oluşturabilirsiniz. (Veritabanına bağlı olarak)