我有一个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
}
基类的active
字段是子实体的标志。只有活动状态的实体才应该在应用程序中加载。然后我编写了一个通用的Spring Data代理接口:
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操作的通用代码。我将为每个服务创建一个服务,但我只想继承抽象类。我想要为每个服务连接特定的存储库,并使用抽象方法将其提供给超类。以下是我的超类实现:
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
}
问题在于
getDao()
方法使用了E
类参数,只保证它是BaseClass
的子类而不是javax.persistence.Entity
。当我试图从我的自定义服务实现中访问DAO时,会出现以下错误:这很有道理,因为Caused by: java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract 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 an entity: class com.mycompany.model.BaseClass at org.hibernate.jpa.internal.metamodel.MetamodelImpl.entity(MetamodelImpl.java:203)
E
被定义为BaseClass
的子类。编译器也允许我编写以下内容:public abstract class GenericService<E extends BaseClass && Entity>
然而,我在子服务中遇到了一个错误,它说Worker
类与E
的签名不兼容。有人知道如何解决这个问题吗?
Worker
。 - cy3erBaseClass
的子类。然而,JPA正在寻找一个@Entity
,而BaseClass
只是一个@MappedSuperclass
。 - Aritz