如何为@MappedSuperclass实施Spring Data存储库

2022-09-01 15:40:58

我有一个JPA和一个扩展它:@MappedSuperClass@Entity

@MappedSuperclass
public class BaseClass {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private Boolean active;

    //getters & setters

}

@Entity
public class Worker extends BaseClass{

    @Column
    private String name;

    //getters & setters

}

基类的字段是子实体的标志。只有活动的应加载到应用程序中。然后我写了一个通用的Spring数据代理接口active

public interface Dao<T extends BaseClass, E extends Serializable> extends
        CrudRepository<T, E> {

    Iterable<T> findByActive(Boolean active);

}

这个接口应该用于数据访问,正确地扩展了前一个接口:Worker

@Transactional
public interface WorkerDao extends Dao<Worker, Long>{}

好吧,现在在我的逻辑层中,我已经实现了一个抽象类,它将包装我的实体上的CRUD操作的通用代码。我将为每个服务提供一个服务,但我只想从中继承。我想为每个服务连接特定的存储库,并使用方法将其提供给超类。这就是我的超类的实现方式:abstractabstract

public abstract class GenericService<E extends BaseClass>{

    public abstract Dao<E, Long> getDao();

    //Here I've got some common operations for managing 
    //all my application classes, including Worker

}

问题在于该方法使用 class 参数,该参数仅保证是 的子参数,而不是 .当我尝试从我的自定义服务实现访问DAO时,我收到以下错误:getDao()EBaseClassjavax.persistence.Entity

原因: java.lang.IllegalArgumentException: 无法为方法公共抽象 java.lang.Iterable com.mycompany.model.daos.interfaces.Dao.findByActive(java.lang.Boolean) 创建查询元模型!at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:93)

Caused by: java.lang.IllegalArgumentException: Not a entity: class com.mycompany.model.BaseClass at org.hibernate.jpa.internal.metamodel.Metamodel.entity(MetamodelImpl.java:203)

这是有道理的,因为 它被定义为 的子项。编译器也允许我写这个:EBaseClass

public abstract class GenericService<E extends BaseClass && Entity>

但是,我在子服务中收到一个错误,指出类与 的签名不兼容。有人知道如何解决这个问题吗?WorkerE


答案 1

这只是将摘要注释为:Repository@NoRepositoryBean

@NoRepositoryBean
public interface Dao<T extends BaseClass, E extends Serializable> extends
        CrudRepository<T, E> {

    Iterable<T> findByActive(Boolean active);

}

通过这种方式,Spring依靠底层存储库实现来执行该方法。findByActive

关于批注类型限制问题,无法声明批注受限类型。请参阅下面引用的答案。

另请参阅:


答案 2

推荐