繁体   English   中英

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

[英]JPA Repository Inheritance - Extend Multiple Interfaces

我的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。

使两者同时工作的最佳方法是什么?

猜测这是一件棘手的事情,因为它实际上是Java不支持的多继承事物,例如参见this

例如,如果有两个相同的注释具有不同的参数,该怎么办?

许多框架(例如Spring数据)在检查注释的继承时都很好,但是只有在没有多重继承和/或具有相同注释的情况下才能猜测。 这些框架可能使用反射来进入“实现树”,但由于上述原因或者如果实施得当会引发异常,它们可能只会选择一条路径。

因此,恐怕您需要执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM