我可以使用一个通用的存储库与Spring Data JPA的mapappedsuperclass的所有孩子



给定如下类结构:

@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 - Animalpersistence.xml中我的类的其余部分一起列出,所以这不是问题。

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

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

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

相关内容

  • 没有找到相关文章

最新更新