给定如下类结构:
@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
?
我知道我可以使用每个实体的存储库和使用instanceof
这样做:
if (thisAnimal instanceof Dog)
dogRepository.save(thisAnimal);
else if (thisAnimal instanceof Cat)
catRepository.save(thisAnimal);
}
但是我不想采用使用instanceof
的坏习惯。
我已经尝试使用这样的通用存储库:
public interface AnimalRepository extends JpaRepository<Animal, Long> {}
但是这会导致这个Exception: Not an managed type: class Animal
。我猜因为Animal
不是Entity
,它是MappedSuperclass
。
最好的解决方案是什么?
BTW - Animal
与persistence.xml
中我的类的其余部分一起列出,所以这不是问题。
实际上问题出在你的映射上。您可以使用@MappedSuperclass
或 @Inheritance
。两者放在一起没有意义。将实体更改为:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Animal {}
不用担心,底层数据库方案是相同的。现在,通用AnimalRepository
将工作。Hibernate将进行自省,并找出用于实际子类型的表。