给出以下类结构:
@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> {}
但是这导致了这个异常:Not an managed type: class Animal
。我猜是因为Animal
不是Entity
,而是MappedSuperclass
。
什么是最好的解决方案?
顺便说一下 - Animal
列出persistence.xml
中的其余部分,所以这不是问题。
答案 0 :(得分:5)
实际上问题在于您的映射。您可以使用@MappedSuperclass
或 @Inheritance
。两者在一起没有意义。将您的实体更改为:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Animal {}
别担心,底层数据库方案是一样的。现在一个,一般AnimalRepository
将起作用。 Hibernate将进行内省并找出用于实际子类型的表。