当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA如何为多个实体构建通用存储库?[副本]

史飞尘
2023-03-14

我开始使用SpringDataJPA存储库。我们已经有一个应用程序使用了Spring MVC(无Spring Boot或Spring数据JPA),在那里我们编写了一个Generic DAO类,该类处理我们拥有的几乎所有实体的基本CRUD操作。任何其他特殊操作都可以通过编写自定义DAO来处理。

现在,Spring data JPA让事情变得非常简单,只需要我们编写一个接口,剩下的就交给我们了。

public interface PersonRepository extends JpaRepository<Person, Long> {

}

这很酷,但是我想知道我是否可以在这里引入泛型。

原因是,我的应用程序有许多实体,我们只需要对其执行基本的 CRUD 操作,仅此而已。这意味着,对于每个实体,我们需要编写一个接口。虽然代码很少,但它为每个实体生成一个文件,我想这是可以避免的(真的吗?

我的问题是,我可以像

public interface GenericRepository<T> extends JpaRepository<T, Long> {

}

这样我的服务班就可以这样了

@Autowired
private GenericRepository<Person> personRepository;

public List<Person> findAll() {
     return this.personRepository.findAll();
}

对于基本操作来说,这将是一种更简洁的方法,因为一个存储库接口处理许多实体。

编辑事实证明,我确实可以创建一个存储库接口,如上所述,但是当应用程序启动时,我收到一个错误,上面写着

Error creating bean with name 'genericRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object

这可能是因为泛型类型

我不得不说,我的实体本身就是独立的类,并没有实现或扩展一个超级实体。如果他们这样做会有帮助吗?

请指引我正确的方向。

谢谢你!

共有1个答案

穆飞星
2023-03-14

我想你可以这样做:

@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
   //added custom common functionality for all the GenericRepository implementations
   public List<T> findByAttributeContainsText(String attributeName, String text);
}

public class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
    implements GenericRepository<T, ID> {

   private EntityManager entityManager;

   public GenericRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
    super(entityInformation, entityManager);
    this.entityManager = entityManager;
}

@Transactional
public List<T> findByAttributeContainsText(String attributeName, String text) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<T> cQuery = builder.createQuery(getDomainClass());
    Root<T> root = cQuery.from(getDomainClass());
    cQuery.select(root).where(builder.like(root.<String>get(attributeName), "%" + text + "%"));
    TypedQuery<T> query = entityManager.createQuery(cQuery);
    return query.getResultList();
}
}
public interface MyOtherRepository extends GenericRepository<Role, Long> {

}

在您的配置类中:

@Configuration
@EnableJpaRepositories(basePackages="com.myProject", repositoryBaseClass = 
GenericRepositoryImpl.class)
public class JpaConfig {

}
 类似资料:
  • 我试图创建一个简单的网站,其中托管主题和评论。我已经从主题开始,并为它们创建了存储库: 我已经在servlet上下文中定义了存储库的路径。xml: 现在,我想在我的存储库中包含注释,但以下代码不起作用: 我的项目甚至都没建好。你能给我一个建议吗,如何为多个实体创建存储库(主题类和注释类是用@Entity声明的)? 我面对的是: TopicRepository类图标上有HDD图片 org.sprin

  • 我有几个实体,并使用Spring Data JPA存储库与规范查询我的数据库。因此,我创建了一个泛型类< code>SpecBuilder来基于查询描述(< code>MyQueryDescriptor)构建我的查询。 我的存储库: 和 现在有三件事我不太确定:< br> 1) 使用泛型SpecBuilder是一个干净的设计吗? 2) 有没有办法避免为每个实体编写这些存储库接口?假设一个通用存储库

  • 我正在使用100个实体(使用JHipster)设置一个新的Spring Boot API,我的问题是:鉴于我有一组存储库层方法,我希望我的所有存储库都能够调用这些方法。 我已经尝试制作所有接口来扩展('RepositoryQuery'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

  • 以下是我的模型:- 我的存储库和服务:- 控制器:- org.springframework.beans.factory.beanCreationException:创建类路径资源[org/springframework/boot/autocconfigure/orm/jpa/hibernatejpaconfiguration.class]中定义的名为“Entity ManagerFactory”

  • 和类似的服务: 我用的是12个实体,大家的服务方式都一样。 谢谢!

  • 我有一个通用实体,我想使用JPA持久化,以便它的通用值存储在单个列中。简化的实体类如下所示: 类型唯一标识泛型值的类,并且允许具有相同类的多个类型: 我没有找到如何使用Hibernate保持这种泛型类的方法。我找到了替代方法和变通方法,但它们在我看来并不理想。我考虑了以下选项: > 将值的类型设置为JsonNode,并将其类型类标记为com。弗拉德米尔恰。冬眠类型json。JsonBinaryTy