Given the following class structure:
@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Animal {}
@Entity
public class Dog {}
@Entity
public class Cat {}
With Spring Data JPA, is it possible to use a generic Animal
Repository to persist an Animal
at runtime without knowing which kind of Animal
it is?
I know I can do it using a Repository-per-entity and by using instanceof
like this:
if (thisAnimal instanceof Dog)
dogRepository.save(thisAnimal);
else if (thisAnimal instanceof Cat)
catRepository.save(thisAnimal);
}
but I don't want to resort to the bad practice of using instanceof
.
I've tried using a generic Repository like this:
public interface AnimalRepository extends JpaRepository<Animal, Long> {}
But this results in this Exception: Not an managed type: class Animal
. I'm guessing because Animal
is not an Entity
, it's a MappedSuperclass
.
What's the best solution?
BTW - Animal
is listed with the rest off my classes in persistence.xml
, so that's not the problem.
Animal
be listed as a class in my persistence unit inpersistence.xml
? Your suggested changed is causing a new exception:Unable to build EntityManagerFactory
. – Vadnee