移动 Spring 使用 JPA 访问数据入门指南,了解更复杂的内容

Moving Spring Accessing Data with JPA getting started guide to something more complex

我能够直接从网站获得示例应用程序 运行ning 在我的机器上:https://spring.io/guides/gs/accessing-data-jpa/.

此示例应用程序可让您开始简单地实施 H2 嵌入式数据库。

只需要对运行的两个依赖:

dependencies {
   compile("org.springframework.boot:spring-boot-starter-data-jpa")
   compile("com.h2database:h2")
   testCompile("junit:junit")
}

此处声明存储库供您参考:

package hello;
import java.util.List;
import org.springframework.data.repository.CrudRepository;

public interface CustomerRepository extends CrudRepository<Customer, Long> {
    List<Customer> findByLastName(String lastName);
}

此存储库已自动连接到配置中。所有文件都包含在同一个 package/directory 中。我假设 spring 足够聪明,可以实例化实现 CustomerRepository 的正确实例,该实例提供与 h2 数据库的正确连接。我不确定这里是如何完成的,但它确实有效。

代码在这里:

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    CustomerRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

当它 运行 默认情况下,它正在构建一个具有默认休眠持久性信息的 JPA 容器并且它 运行 没问题。

但是,当我决定使用此代码作为基准并将 CustomerRepository 移动到另一个包 jpa 时,我无法再将存储库自动装配到应用程序中。

将@ComponentScan("jpa") 添加到应用程序没有帮助:

.NoSuchBeanDefinitionException:没有 [jpa.CustomerRepository] 类型的合格 bean

将@EnableJpaRepositories("jpa") 添加到应用程序会产生不同的错误:

IllegalArgumentException:不是托管类型:class jpa.Customer

因此,只要所有相关的 class 都在同一个包中,看起来我可以使用 JPA/Hibernate/H2 进行非常简约的配置。

我的问题是,当我想将东西移动到不同的包中时,我是否必须立即转向更复杂的配置,或者是否保留这种极简主义但仍然能够将东西分开。

最简单的方法是将 Application class 保留在包层次结构的根包中,并将其他 class 移动到子包中。

org.example
     |
      --- Application.java
     |
      --- jpa
     |   |
     |    --- CustomerRepository.java
     |
      --- model
         |
          --- Customer.java

或者,如果您希望每个 class 在其自己的子包中,例如:

org.example
     |
      --- bootstrap
     |   |
     |    --- Application.java
     |
      --- jpa
     |   |
     |    --- CustomerRepository.java
     |
      --- model
         |
          --- Customer.java

您还需要使用 @EntityScan

@SpringBootApplication
@EnableJpaRepositories("org.example.jpa")
@EntityScan("org.example.model")
public class Application ...

详情见official documentation

我也被这个问题搞糊涂了。我在 spring.io 网站上找到了一些东西。描述为@manish,分享给大家

By default, Spring Boot will enable JPA repository support and look in the package (and its subpackages) where @SpringBootApplication is located. If your configuration has JPA repository interface definitions located in a package not visible, you can point out alternate packages using @EnableJpaRepositories and its type-safe basePackageClasses=MyRepository.class parameter.

https://spring.io/guides/gs/accessing-data-jpa/