2009-05-27 17 views
7

Mam obiekt z polem, które może być liczbą typów obiektów. Ten obiekt jest zakodowany w pojedynczej tabeli z kolumną dyskryminacyjną dla podtypów tego pola. Każdy z tych podtypów ma przypisane ich pola do kolumny w tabeli obiektów nadrzędnych. Nie mogę tego modelować w hibernacji. Kod poniżej zwróci wartość null dla getSubfield() niezależnie od tego, jakie dane podtypu znajdują się w tabeli.Hibernate Embeddable Inheritance

Schema

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

Domain Przedmioty

@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; 
} 

"SELECT P z macierzystej p"

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

Czy to możliwie pobiera le, aby osiągnąć to, czego chcę w tym modelu obiektowym, lub czy muszę uzyskać nieco więcej kreatywności (jest to starsza baza danych, zmiana schematu nie jest preferowana)

+1

Kolega z pracy wskazał mi http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910. Domyślam się, że nie jest obsługiwany = \ –

Odpowiedz

3

Ok, nie można łatwo zmienić schematu, ale co powiesz na dodanie kilku widoków?

+1

Dobry pomysł, niestety, wciąż jest modyfikacją struktury bazy danych. Próbuję rozwiązać ten problem za pomocą kodu, jeśli nic innego, to wydaje się czymś, co potrafi hibernacja i jestem ciekawa, co robię źle. –

+1

+1 do Twojego komentarza i przypominając SO, że czasami nie możemy "naprawić" i naprawić złych schematów schematów. :-) – cbmeeks

1

Wiem, że to jest stare.

Jeden sposób obejścia tego jest określony powyżej. Utwórz widok. Mówisz, że nie chcesz zmieniać schematu. Więc nie rób tego. Możesz utworzyć nowy schemat, który mapuje stary schemat i robi to, co chcesz. (Prawdopodobnie w zależności od bazy danych)

Powiązane problemy