Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有Spring引导的情况下使用JPA存储库_Java_Spring_Hibernate_Spring Data Jpa_Spring Repositories - Fatal编程技术网

Java 如何在没有Spring引导的情况下使用JPA存储库

Java 如何在没有Spring引导的情况下使用JPA存储库,java,spring,hibernate,spring-data-jpa,spring-repositories,Java,Spring,Hibernate,Spring Data Jpa,Spring Repositories,我有一个现有的Spring4项目(mvc、jdbc等),我试图将其移植到SpringBoot,但我做不到。(很多麻烦,没人能解释我是怎么做到的)。但现在我只想在现有项目中使用SpringDataJPA。 这是pom的一个主要依赖项: <properties> <jetty.version>9.3.5.v20151012</jetty.version> <spring.version>4.3.12.RELEASE<

我有一个现有的Spring4项目(mvc、jdbc等),我试图将其移植到SpringBoot,但我做不到。(很多麻烦,没人能解释我是怎么做到的)。但现在我只想在现有项目中使用SpringDataJPA。 这是pom的一个主要依赖项:

<properties>
        <jetty.version>9.3.5.v20151012</jetty.version>
        <spring.version>4.3.12.RELEASE</spring.version>
        <spring.boot.version>1.5.8.RELEASE</spring.boot.version>
        <spring.security.version>4.2.3.RELEASE</spring.security.version>
        <quartz.version>2.2.1</quartz.version>
        <slf4j.version>1.7.5</slf4j.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <hibernate-version>5.3.3.Final</hibernate-version>
    </properties>

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
            <version>${spring.boot.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-validation</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.logging</groupId>
                    <artifactId>jboss-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-validator</artifactId>
                </exclusion>

            </exclusions>
        </dependency>
    <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.0.5.RELEASE</version>
        </dependency>
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate-version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate-version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
用于测试的Derby数据库。但主要的数据库类型是带有HikariCP的PostgreSQL。我已经在项目中添加了HQL支持,它工作正常。但是当我尝试添加JAP存储库支持时,我遇到了很多问题。我有一个实体:

@Entity
@Table(name = "users", schema = "public", catalog = "test")
public class Users {
    private int id;
    private String username;
    private String password;
    private String email;

    @Id
    @Column(name = "id", nullable = false)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Basic
    @Column(name = "username", nullable = false, length = 64)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "password", nullable = false, length = 64)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Basic
    @Column(name = "email", nullable = false, length = 128)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Users that = (Users) o;
        return id == that.id &&
                Objects.equals(username, that.username) &&
                Objects.equals(password, that.password) &&
                Objects.equals(email, that.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, password, email);
    }
}
和存储库:

@Repository
public interface UsersRepository extends CrudRepository<Users, Long> {

    @Query("select b from Users b where b.username = :username")
    Users findByName(@Param("username") String username);
}
仅此而已。 我不使用Spring Boot(如上所述)并在应用程序出现错误时启动:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ru.testproject.config.DBConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is java.lang.NoSuchFieldError: parallelCapableClassLoaderAvailable
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:587)
如果我对@EnableJpaRepositories注释进行注释,则会出现以下错误:

Unsatisfied dependency expressed through field 'userServiceImpl'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'usersRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'ru.testproject.db.hibernate.repository.UsersRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
在第二个场景中,存储库是空的,当然-JPA repo被禁用。。
求求你,救命!我做错了什么?我怎样才能让它起作用?我无法用谷歌和互联网解决我的问题。可能是因为我不明白根本问题是什么。

似乎您没有在组件扫描中添加测试包ru.testproject.db.hibernate.repository。

请向所有人求助! 我已通过以下更改解决了我的问题: 1) 首先-我已经用更新的版本更新了spring上下文依赖关系:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>
注释。以前的变化对任何积极的变化都没有影响。1)导致entityManagerFactory错误,我可以用以下方法解决:

3) 使用为entityManagerFactory设置PackageToScan

entityManagerFactoryBean.setPackagesToScan("ru.testproject.hibernate.entity");
具有实体的路径(在这种情况下为用户)

仅此而已。现在存储库工作得很好。谢谢大家


ps:可能是,现在我可以从spring boot开始)

在该线程中,最后一条评论描述了EntityManagerFactory的相同问题。阅读手册并查看示例我已经检查了许多示例,下面的手册描述了spring boot配置。这并不是我想要的。你能试着将@EnableJpaRepositories(“ru.testproject.*)替换为@EnableJpaRepositories(“ru.testproject.db.hibernate.repository”)@ComponentScan(“ok.testproject.hibernate.repository”),但它不起作用,但显示“ru.testproject.db.hibernate.repository”包时出错。你能确认你使用了正确的软件包名称吗?是的,我刚刚重命名了软件包。但您是对的:一些问题是由错误的组件路径引起的
Unsatisfied dependency expressed through field 'userServiceImpl'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'usersRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'ru.testproject.db.hibernate.repository.UsersRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>
@EnableJpaRepositories(basePackages = {
        "ru.testproject.hibernate"
})
@PropertySource("classpath:testproject.properties")
@ComponentScan("ru.testproject.hibernate")
entityManagerFactoryBean.setPackagesToScan("ru.testproject.hibernate.entity");