移动Spring访问数据与JPA入门指导更复杂的事情

时间:2015-03-17 01:48:40

标签: spring-boot spring-data-jpa

我能够直接从网站{@ 3}}在我的机器上运行示例应用程序。

这个示例应用程序让您开始使用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);
}

此存储库已自动装配到配置中。所有文件都包含在同一个包/目录中。我假设spring非常聪明,可以实例化实现CustomerRepository的bean的正确实例,该实例提供与h2database的正确连接。我不确定这是怎么做到的,但它确实有效。

代码在这里:

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);
    }
}

当它运行时看起来默认情况下,它构建一个具有默认hibernate持久性信息的JPA容器,并且运行正常。

但是,当我决定使用此代码作为基线并将CustomerRepository移动到另一个包jpa时,我不再能够将存储库自动装入应用程序。

将@ComponentScan(&#34; jpa&#34;)添加到应用程序没有帮助:

.NoSuchBeanDefinitionException:没有[jpa.CustomerRepository]类型的限定bean

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

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

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

我的问题是,当我想把东西搬到不同的包装中时,我是否必须立即转向更复杂的配置,或者是为了保持这种极简主义但仍然可以将事物分开。

2 个答案:

答案 0 :(得分:3)

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

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

或者,如果您希望子包中的每个类都有自己的类,例如:

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

答案 1 :(得分:1)

我也对这个问题感到困惑。我在spring.io网站上找到了一些东西。它被描述为@manish,与你分享。

  

默认情况下,Spring Boot将启用JPA存储库支持并查看@SpringBootApplication所在的包(及其子包)。如果您的配置包含位于包中的JPA存储库接口定义,则可以使用@EnableJpaRepositories及其类型安全的basePackageClasses = MyRepository.class参数指出备用包。

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