Spring Data JPA:创建一个抽象存储库

鉴于以下类别:

@MappedSuperclass @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) @DiscriminatorColumn(name="animalType",discriminatorType=DiscriminatorType.STRING) @QueryExclude public abstract class Animal {} @Entity @DiscriminatorValue("dog") public class Dog {} @Entity @DiscriminatorValue("cat") public class Cat {} 

有可能以某种方式为Animal配置JPA存储库吗?

我试过了

 public interface AnimalRepository extends JpaRepository 

然而,这失败了:

java.lang.IllegalArgumentException:不是托管类型:Animal

有没有办法配置这个?

我希望能够执行以下任务:

 @Autowired private AnimalRepository repository; public void doSomething() { Animal animal = repository.findById(123); animal.speak(); } 

我有类似的错误。 我通过将实体类的映射添加到我的persistence.xml文件来解决它。

所以也许可以在你的persistence.xml中添加这样的东西:

  ... yourpackage.Animal ...  

我遇到了这个问题,我找到了解决方案:您需要使用@MappedSuperclass @Inheritance ,而不是两者都使用。 像这样注释你的Animal类:

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

底层数据库方案将保持不变,现在您的通用AnimalRepository应该可以工作。 持久性提供程序将执行内省并找出用于实际子类型的表。

我猜你正在运行Hibernate作为你的持久性提供者,对吧? 我偶然发现了Hibernate的这种情况问题,因为针对Hibernate元模型的类型查找行为与JPA中指定的行为不正确( 详情请参阅此bug )。 所以看来你有两个选择:

  1. 将抽象超类也改为@Entity
  2. 切换到其他持久性提供程序

您需要在webconfig中的@EntityScan中包含Animal类

Tente desta maneira:

 public interface RepositorioAnimal extends JpaRepository { } 

 @Repository @Transactional( readOnly = true ) public class RepositorioAnimal extends QueryDslJpaRepository implements RepositorioAnimal { @Inject public RepositorioAnimal( EntityManager em ) { super( new JpaMetamodelEntityInformation( Animal.class, em.getMetamodel() ), em ); } } 

 public interface ServicoAnimal { void salvar( Animal entidade ); void remover( Animal entidade ); Animal carregar( Long id ); } 

 @Service @Component public class ServicoAnimalImpl implements ServicoAnimal { @Inject private RepositorioAnimal animal; @Override public void salvar( Animal entidade ) { animal.save( entidade ); } @Override public void remover( Animal entidade ) { animal.delete( entidade ); } @Override public Animal carregar( Long id ) { return animal.findOne( id ); } }