2013-01-11 20 views
7

Data la seguente struttura di classe:Posso utilizzare un repository generico per tutti i bambini di un MappedSuperClass con Spring Data JPA?

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

@Entity 
public class Dog {} 

@Entity 
public class Cat {} 

Con primavera dati JPA, è possibile utilizzare un generico Animal Repository a persistere un Animal in fase di esecuzione, senza sapere che tipo di Animal è?

so che posso farlo utilizzando un'entità repository-per-e utilizzando instanceof come questo:

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

ma non voglio ricorrere alla cattiva pratica di usare instanceof.

Ho provato con un repository generico come questo:

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

Ma questo si traduce in questa eccezione: Not an managed type: class Animal. Sto indovinando perché Animal non è un Entity, è un MappedSuperclass.

Qual è la soluzione migliore?

BTW - Animal è elencato con il resto delle classi in persistence.xml, quindi non è questo il problema.

risposta

4

In realtà il problema riguarda la mappatura. O usi @MappedSuperclasso@Inheritance. Entrambi insieme non hanno senso. Cambia la tua entità in:

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

Non preoccuparti, lo schema del database sottostante è lo stesso. Ora uno, il generale AnimalRepository funzionerà. Hibernate eseguirà l'introspezione e scoprirà quale tabella utilizzare per un sottotipo effettivo.

+0

"Animale" deve essere elencato come classe nella mia unità di persistenza in 'persistence.xml'? La tua modifica suggerita sta causando una nuova eccezione: 'Impossibile creare EntityManagerFactory'. –

+0

@ CFL_Jeff: tipicamente mi affido solo alle annotazioni, quindi non ne sono sicuro. Puoi pubblicare tracce complete dello stack da qualche parte, incluso 'Caused by'? –

+0

Sembra che io abbia altri problemi oltre a questo. Credo che tu mi abbia aiutato a risolvere il problema, e lavorerò sui nuovi problemi. Grazie! –

Problemi correlati