问题
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.
回答1:
Actually the problem is with your mapping. You either use @MappedSuperclass
or @Inheritance
. Both together don't make sense. Change your entity to:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Animal {}
Don't worry, the underlying database scheme is the same. Now one, general AnimalRepository
will work. Hibernate will do the introspection and find out which table to use for an actual subtype.
来源:https://stackoverflow.com/questions/14286841/can-i-use-a-generic-repository-for-all-children-of-a-mappedsuperclass-with-sprin