13

给定以下类结构:

@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,所以这不是问题。

4

1 回答 1

8

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

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

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

于 2013-01-11T21:28:47.130 回答