2013-01-11 17 views
7

Biorąc pod uwagę następujące klasy strukturę:Czy mogę użyć ogólnego repozytorium dla wszystkich dzieci z klasy MappedSuperClass z wiosennym JPA danych?

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Animal {} 

@Entity 
public class Dog {} 

@Entity 
public class Cat {} 

Z Wiosna Danych WZP, możliwe jest użycie rodzajowe Animal repozytorium utrzymują się Animal w czasie wykonywania, nie wiedząc, jaki rodzaj Animal to jest?

wiem, że mogę to zrobić za pomocą jednostki Repository-per-a za pomocą instanceof takiego:

if (thisAnimal instanceof Dog) 
    dogRepository.save(thisAnimal); 
else if (thisAnimal instanceof Cat) 
    catRepository.save(thisAnimal); 
} 

ale nie chcę uciekać się do złych praktyk korzystania instanceof.

Próbowałem przy użyciu rodzajowe repozytorium tak:

public interface AnimalRepository extends JpaRepository<Animal, Long> {} 

Ale powoduje to ten wyjątek: Not an managed type: class Animal. Zgaduję, ponieważ Animal nie jest Entity, to jest MappedSuperclass.

Jakie jest najlepsze rozwiązanie?

BTW - Animal jest wymieniony wraz z resztą poza zajęciami w persistence.xml, więc to nie problem.

Odpowiedz

4

W rzeczywistości problem dotyczy mapowania. Używasz albo @MappedSuperclasslub@Inheritance. Obie razem nie mają sensu. Zmień swój podmiot na:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Animal {} 

Nie martw się, podstawowy schemat bazy danych jest taki sam. Teraz jeden, ogólny AnimalRepository zadziała. Hibernacja wykona introspekcję i sprawdzi, której tabeli użyć dla rzeczywistego podtypu.

+0

Czy "Zwierzę" powinno być wymienione jako klasa w mojej jednostce trwałości w 'persistence.xml'? Twoja sugerowana zmiana powoduje nowy wyjątek: "Nie można zbudować EntityManagerFactory". –

+0

@CFL_Jeff: zazwyczaj polegam tylko na adnotacjach, więc nie jestem pewien. Czy możesz gdzieś opublikować pełny stos, w tym 'Caused by'? –

+0

Wygląda na to, że oprócz tego mam inne problemy. Uważam, że pomogłeś mi rozwiązać problem, a ja będę pracował nad nowymi problemami. Dzięki! –

Powiązane problemy