Могу ли я использовать общий репозиторий для всех дочерних элементов 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 выполнит самоанализ и выяснит, какую таблицу использовать для фактического подтипа.