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