java - 是否可以通过继承自定义 Jpa 存储库?
问题描述
假设我有两个类:主题和客户端,主题是基类。
@Entity
public class Client extends Subject
现在我想添加自定义的 Jpa 基本接口,因此可以在子接口中访问方法:
@NoRepositoryBean
public interface SubjectRepository <T extends Subject> extends
JpaRepository<T, Long>, CustomSubjectRepository<T> {}
CustomSubjectRepository看起来像:
public interface CustomSubjectRepository<T extends Subject> {
void saveEncrypted(T subject);
}
我需要实现,所以我声明类:
@Repository
@Transactional
public class CustomSubjectRepositoryImpl<T extends Subject> implements
CustomSubjectRepository<T> {
@PersistenceContext
private EntityManager entityManager;
@Override
public void saveEncrypted(T subject) {
//implementation
}
}
然后想创建ClientRepository并从 SubjectRepository 继承以访问saveEncrypted方法。
@Repository
public interface ClientRepository extends SubjectRepository<Client> {
}
但是在编译时我得到:
创建名为“clientRepository”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException:无法为方法 public abstract void com.path.repositories.CustomSubjectRepository.saveEncrypted(com.path.models.Subject) 创建查询!未找到类型 Client 的属性 saveEncrypted!
解决方案
您正在扩展接口,这样 Spring 将尝试创建一个名为的查询saveEncrypted
,而不是使用自定义方法。
我相信最好的解决方案是扩展类CustomSubjectRepositoryImpl
。
@Repository
public class ClientRepository extends CustomSubjectRepositoryImpl<Client> {
}
推荐阅读
- haskell - 为什么绑定运算符(>>=)按原样定义?
- javascript - 维护与数据库同步的 MobX 对象
- c# - Web.config c#中连接字符串的加密
- c# - 在 Xamarin.Forms 中使用 Android 绑定
- javascript - 如何使用 Apollo Client 创建订阅配置?
- regex - 使用 Regexextract 从 Google 表格中的文本中提取日、月、2 位数年份
- gstreamer - 如何在 Yocto 的目标映像上安装已编译的 gstreamer-plugins
- android - Android 在 Android 中设置 Spinner 值
- python - 字符串具有指定长度的Python数据帧
- c - Process Forks Shell,然后整个程序停止?