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.
"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'. –
@ 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'? –
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! –