如何为@MappedSuperclass实施Spring Data存储库
我有一个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操作的通用代码。我将为每个服务提供一个服务,但我只想从中继承。我想为每个服务连接特定的存储库,并使用方法将其提供给超类。这就是我的超类的实现方式:abstract
abstract
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()
E
BaseClass
javax.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)
这是有道理的,因为 它被定义为 的子项。编译器也允许我写这个:E
BaseClass
public abstract class GenericService<E extends BaseClass && Entity>
但是,我在子服务中收到一个错误,指出类与 的签名不兼容。有人知道如何解决这个问题吗?Worker
E