Могу ли я использовать общий репозиторий для всех дочерних элементов MappedSuperClass с Spring Data JPA?

учитывая следующую структуру классов:

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

@Entity
public class Dog {}

@Entity
public class Cat {}

С весенние данные JPA, можно ли использовать универсальную Animal репозиторий для сохранения Animal во время выполнения, не зная, какой вид Animal - это?

я знаю, что могу сделать это с помощью репозитория на объект и с помощью instanceof такой:

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

но я не хочу прибегать к плохой практикой использования instanceof.

я пробовал использовать общий Репозиторий такой:

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

но это приводит к этому исключению:Not an managed type: class Animal. Я предполагаю, потому что Animal - это не Entity, это MappedSuperclass.

какое лучшее решение?

кстати Animal перечислен с остальными моими классами в persistence.xml, так что это не проблема.

1 ответов


на самом деле проблема с отображением. Вы либо используете @MappedSuperclass или @Inheritance. Оба вместе не имеют смысла. Измените свой объект на:

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

Не волнуйтесь, базовая схема базы данных такая же. Теперь один, генерал!--3--> будет работать. Hibernate выполнит самоанализ и выяснит, какую таблицу использовать для фактического подтипа.