Spring Data Jpa是否支持存储库继承以及如何支持



我有一个简单的实体继承树,由以下部分组成:

abstract class Item (id, ...)
class Chart extends Item (...)
class Table extends Item (...)

每个类都有自己的存储库:ItemRepositoryChartRepositoryTableRepository。所有三个存储库都是公开的

由于域规则的原因,我需要在删除时实现自定义逻辑,如下所述:http://docs.spring.io/spring-data/jpa/docs/1.10.3.RELEASE/reference/html/#repositories.custom-实现

这个自定义删除逻辑涉及继承树中的所有实体(抽象实体和两个具体实体)。

有没有办法在ItemRepository上实现自定义逻辑,并使子实体的存储库扩展ItemRepository

这将避免继承树的每个实体重复相同的逻辑。没有这些,这就产生了很多样板类:

EntityRepository+EntityRepositoryCustom+EntityRepositoryImplx3 entities=9 classes只是为了实现删除时要执行的1行代码。。。

编辑

用户user7398104的回答让我走上了实现这里和那里所解释的东西的道路,但这些资源并没有解释如何在@NoRepositoryBean基本存储库上实现自定义存储库。我尝试了以下没有运气:

@NoRepositoryBean
public interface ItemBaseRepository<T extends Item> extends 
CrudRepository<T, Integer>,
ItemBaseRepositoryCustom<T>
@RepositoryRestResource
public interface ItemRepository extends ItemBaseRepository<Item> {}
@RepositoryRestResource
public interface ChartRepository extends ItemBaseRepository<Item> {}
@RepositoryRestResource
public interface TableRepository extends ItemBaseRepository<Item> {}
public interface ItemBaseRepositoryCustom<T extends Item> {
public void delete (T i);
}
public class ItemBaseRepositoryImpl<T extends Item>
implements ItemBaseRepositoryCustom<T> {
public void delete (T i) {
// Custom logic
}
}

编辑编辑

我试着按照评论中的建议将@NoRepositoryBean设置为ItemBaseRepositoryCustom,但也不起作用。

您可以创建扩展ItemRepository接口的ItemRepositoryCustom接口,每个图表和表repo都扩展ItemRepositoryCustom repo。对于此接口,您可以自定义删除操作的实现。

编辑:我刚刚意识到这是行不通的。

但以下方法是可行的。

interface CustomItemRepository<T extends Item> extends CrudRepository<T, Long>{ }

interface ChartRepository extends CustomItemRepository<Chart>{ }

interface TableRepository extends CustomItemRepository<Table>{ }

然后,您可以为CustomItemRepository的删除逻辑创建一个类。

最新更新