java – JPA存储库继承 – 扩展多个接口

我的JPA存储库扩展了一个自定义接口,该接口带有用于以通用方式处理授权的注释.

public interface MultiTenantCrudRepo<T, ID> extends CrudRepository<T, ID>

该接口将@PreAuthorize,@ PostAuthorize,@ PreFilter和@PostFilter注释添加到CrudRepository的方法中.

此外,对于某些实体,我需要实现软删除.为此,我创建了一个“SoftDeleteRepository”,如下所示:

public interface SoftDeleteRepository<T extends BaseEntity<I> & SoftDeletable, I extends Serializable> extends CrudRepository<T, I> {

    @Query("update #{#entityName} e set e.isDeleted = true where e.id = ?#{#entity.id}")
    @Modifying
    @Override
    public void delete(@Param("entity") T entity);

你可以看到它添加了@Query注释来实现我需要的功能.

两个接口都按预期独立工作,但是当存储库需要这两个属性(授权和软删除)时

public interface FooRepo extends SoftDeleteRepository<Foo, Long>, MultiTenantCrudRepo<Foo, Long> {

似乎只有“扩展”之后的第一个接口的注释才有效.所以在这种情况下,我得到一个FooRepo,支持软delection但没有授权验证.

让两者兼顾的最佳方法是什么?

最佳答案 猜猜这是一个棘手的事情,因为它实际上是Java不支持的多继承事物,例如见
this.

例如,如果有两个相同的注释具有不同的参数,会选择什么?

许多框架 – 比如Spring数据 – 在检查注释的继承时做得很好,但只有在没有多重继承和/或具有相同注释的情况下才会猜测.这些框架可能会使用反射来实现“实现树”,但由于上述原因可能只选择一条路径,或者如果实现得好则抛出异常.

因此,我担心你需要做的事情如下:

public interface SoftDeleteMultitenantRepository
                     extends MultiTenantCrudRepo<Foo, Long> {
 // a copy of your soft delete method here
}
点赞