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

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

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

@Entity
public class Dog {}

@Entity
public class Cat {}

Можно ли с помощью Spring Data JPA использовать общий репозиторий Animal для сохранения Animal во время выполнения, не зная, какой это тип Animal?

Я знаю, что могу сделать это, используя Repository-per-entity и используя 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, так что это не проблема.


person CFL_Jeff    schedule 11.01.2013    source источник


Ответы (1)


На самом деле проблема с вашим отображением. Вы можете использовать @MappedSuperclass или @Inheritance. И то, и другое вместе не имеет смысла. Измените свою сущность на:

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

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

person Tomasz Nurkiewicz    schedule 11.01.2013
comment
Должен ли Animal быть указан как класс в моем блоке персистентности в persistence.xml? Предлагаемое вами изменение вызывает новое исключение: Unable to build EntityManagerFactory. - person CFL_Jeff; 12.01.2013
comment
@CFL_Jeff: обычно я полагаюсь только на аннотации, поэтому не уверен. Можете ли вы где-нибудь опубликовать полную трассировку стека, включая Caused by? - person Tomasz Nurkiewicz; 12.01.2013
comment
Похоже, у меня есть и другие проблемы, помимо этой. Я считаю, что вы помогли мне решить насущную проблему, и я буду работать над новыми проблемами. Спасибо! - person CFL_Jeff; 12.01.2013
comment
@CFL_Jeff: пожалуйста, опубликуйте ссылку на дополнительные вопросы, если они у вас есть. - person Tomasz Nurkiewicz; 12.01.2013