我有一个简单的实体继承树,由以下部分组成:
abstract class Item (id, ...)
class Chart extends Item (...)
class Table extends Item (...)
每个类都有自己的存储库:ItemRepository
、ChartRepository
和TableRepository
。所有三个存储库都是公开的。
由于域规则的原因,我需要在删除时实现自定义逻辑,如下所述:http://docs.spring.io/spring-data/jpa/docs/1.10.3.RELEASE/reference/html/#repositories.custom-实现
这个自定义删除逻辑涉及继承树中的所有实体(抽象实体和两个具体实体)。
有没有办法在ItemRepository
上实现自定义逻辑,并使子实体的存储库扩展ItemRepository
?
这将避免继承树的每个实体重复相同的逻辑。没有这些,这就产生了很多样板类:
EntityRepository
+EntityRepositoryCustom
+EntityRepositoryImpl
x3 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的删除逻辑创建一个类。