我可以使用Spring Data JPA为MappedSuperClass的所有子项使用通用存储库吗?

时间:2013-01-11 21:21:35

标签: spring hibernate jpa spring-data-jpa mappedsuperclass

给出以下类结构:

@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中的其余部分,所以这不是问题。

1 个答案:

答案 0 :(得分:5)

实际上问题在于您的映射。您可以使用@MappedSuperclass @Inheritance。两者在一起没有意义。将您的实体更改为:

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

别担心,底层数据库方案是一样的。现在一个,一般AnimalRepository将起作用。 Hibernate将进行内省并找出用于实际子类型的表。