首页 > 解决方案 > @Repository 和 @EnableJpaRepositories 都不适用于最新的 Hibernate 和 Spring

问题描述

我正在尝试使用最新的最佳实践来启用 Hibernate。

所以我有这个:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.4.1</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.27.Final</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.3.2</version>
    </dependency>

(每个依赖项都是截至发布之日的最新版本)

和这个

@Repository
public interface UserRepository extends JpaRepository<UserInfo, Long> {

}

和这个:

@ContextConfiguration(locations = { "classpath:spring-backend-dao.xml" })
@EnableJpaRepositories("com.cth.orm")
@EntityScan("com.cth.orm")
public class UserRepositoryTest extends AbstractJUnit4SpringContextTests {

    @Autowired private UserRepository target;

    @Test
    public void test() {
    }

}

那么为什么我会收到这个错误?

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“com.cth.orm.UserRepository”类型的合格bean:预计至少有1个符合自动装配候选资格的bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

请注意,当我开始时我没有@EnableJpaRepositories. 这是在对 Google 和 SO 进行广泛研究后添加的,但它并没有解决问题。

标签: springspring-boothibernate

解决方案


有点难以猜测 - 所以一些笔记。

您不需要 Hibernate 或 spring-orm 参考(包含在 starter-data-jpa 中),但您需要拥有数据库 jdbc 依赖项,例如:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

不知道你为什么使用@ContextConfiguration - 我猜你正在使用Spring Boot而不是普通的Spring?所以你需要一个像这样的配置类:

@Configuration
@EntityScan(basePackages = {"com.cth.orm"})
@EnableJpaRepositories(basePackages = {"com.cth.orm"})
@EnableTransactionManagement // optional
public class DomainConfig {
}

这个类应该在主文件夹中,仅仅在测试中是不够的。

您可以尝试使用https://bootify.io来获得一个正在运行的带有数据库模型的 Spring Boot 项目,以及最新的最佳实践。


推荐阅读