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 )。 所以看来你有两个选择:
- 将抽象超类也改为
@Entity
- 切换到其他持久性提供程序
您需要在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 ); } }