2011-11-30 18 views
6

Używam adnotacji Hibernate, aby utrzymać swoje klasy. Obecnie używam następującej strategii do mapowania klasHibernate polimorficzna instrukcja SELECT HQL

Mam klasę abstrakcyjną, która jest klasą nadrzędną i mam dwie podklasy, które po niej dziedziczą Matka, ojciec.

I odwzorowane to tak:

@MappedSuperclass 
public abstract class Parent { 

private int age; 
private String name; 
... 
} 

a dwie inne klasy są zadeklarowane tak:

@Entity 
public Class Father extends Parent { 

private boolean haveMustash; 
... 
} 

Więc w zasadzie taki scenariusz jest "Tablica w klasie".

Teraz chcę utworzyć oświadczenie Hibernuj HQL, które zaktualizuje wiek rodzica, niezależnie od jego rodzaju (matka, ojciec). rodzic zostanie sprawdzony przy użyciu kolumny nazwy, która jest unikalna w obu tabelach. ale nie wiem tylko patrząc na imię, jeśli jest to Matka lub Ojciec. Jak utworzyć instrukcję HQL, która będzie wyglądała w obu tabelach i zwróci odpowiednią jednostkę do aktualizacji?

myślałem o czymś takim: (ale nie mam pojęcia, czy jest w ogóle możliwe)

Parent parent = hibernateTemplate.find("from Mother,Father where name=" 
     + name); 

Odpowiedz

2
from Parent p where p.name = :name 

(nie testowane).

Należy zauważyć, że jeśli zadziała, doprowadzi to do dwóch zapytań, ponieważ oba te elementy nie mają ze sobą nic wspólnego, z wyjątkiem dziedziczenia niektórych odwzorowanych atrybutów z nadklasy. Nie masz tutaj dziedziczenia jednostek i nie implementuj tabeli na strategię klasy. Można to zrobić, jeśli Parent został oznaczony jako @Entity zamiast @MappedSuperClass, a jeśli zdefiniowałeś strategię dziedziczenia, używając @Inheritance.

+0

To nie działa, otrzymuję Parent nie jest odwzorowany (wyjątek Hibernacja) – stdcall

+0

Cóż, następnie zamapuj go. –

+0

Cała idea polega na tym, że nie można jej zmapować, jest to klasa abstrakcyjna, Ojciec i Matka pobierają z niej swoje podstawowe mapowanie. – stdcall

-1

Zgodnie z odniesieniem do trybu hibernacji to działa!

Może pojawić się wiele klas, w wyniku czego powstanie iloczyn kartezjański lub połączenie "krzyżowe".

from Formula, Parameter

(patrz 14.2)

Hibernate Reference

Można również wyszukiwać w obu tabelach osobno, a następnie sprawdzić, który z nich nie jest null?

1

JB Nizet ma odpowiedź. Użyj @Entity, aby zamapować Parent, zamiast @MappedSuperclass. Pozwala to na uruchamianie zapytań Hibernate i aktualizacji na Parent, (ten ostatni pozwala tylko uruchomić go na Father and Mother). Możesz zachować swój stół w klasie, używając adnotacji @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS).

from Mother,Father nie będzie działać, ponieważ niejawnie dołącza do tabel. To, czego chcesz, to związek. Za pomocą funkcji Hibernuj zrobi to automatycznie.

+0

Dobre wyjaśnienie. Informacje o dziedziczeniu muszą zostać dodane do klasy nadrzędnej, aby umożliwić Hibernate wykonanie zadania. – germanio

Powiązane problemy