Spring boot 使用JPA移动Spring访问数据入门指南
我可以直接从以下网站获得在我的机器上运行的示例应用程序: 这个示例应用程序让您从H2嵌入式数据库的简单实现开始 它只需要两个依赖项即可运行:Spring boot 使用JPA移动Spring访问数据入门指南,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我可以直接从以下网站获得在我的机器上运行的示例应用程序: 这个示例应用程序让您从H2嵌入式数据库的简单实现开始 它只需要两个依赖项即可运行: dependencies { compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("com.h2database:h2") testCompile("junit:junit") } 此处声明存储库供您参考: package hello; imp
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);
}
当它运行时,它看起来像是在默认情况下,它正在使用默认的hibernate持久性信息构建一个JPA容器,并且运行良好
但是,当我决定使用此代码作为基线并将CustomerRepository移动到另一个包jpa时,我就无法将存储库自动连接到应用程序中
将@ComponentScan(“jpa”)添加到应用程序无助于:
.NoSuchBeanDefinitionException:没有[jpa.CustomerRepository]类型的合格bean
将@EnableJpaRepositories(“jpa”)添加到应用程序会产生不同的错误:
IllegalArgumentException:不是托管类型:类jpa.Customer
因此,只要所有相关类都在同一个包中,我就可以使用JPA/Hibernate/H2进行非常简单的配置
我的问题是,当我想将东西移动到不同的包中时,是否需要立即转向更复杂的配置,或者保留这种极简主义,但仍然能够将事物分开。最简单的方法是将
应用程序
类保留在包层次结构的根包中,并将其他类移动到子包中
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 ...
有关详细信息,请参阅。最简单的方法是将
应用程序
类保留在包层次结构的根包中,并将其他类移动到子包中
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 ...
有关详细信息,请参阅。我也对这个问题感到困惑。我在spring.io网站上找到了一些东西。它被描述为@manish,与你分享 默认情况下,Spring Boot将启用JPA存储库支持,并查看@SpringBootApplication所在的包(及其子包)。如果配置中的JPA存储库接口定义位于不可见的包中,则可以使用@EnableJpaRepositories及其类型安全的basePackageClasses=MyRepository.class参数指出备用包
我也对这个问题感到困惑。我在spring.io网站上找到了一些东西。它被描述为@manish,与你分享 默认情况下,Spring Boot将启用JPA存储库支持,并查看@SpringBootApplication所在的包(及其子包)。如果配置中的JPA存储库接口定义位于不可见的包中,则可以使用@EnableJpaRepositories及其类型安全的basePackageClasses=MyRepository.class参数指出备用包
谢谢Manish,如果我想将存储库移动到应用程序类包层次结构之外的自己的包中,我是否被迫手动配置hibernate?我想知道为什么?我试图找到文档来解释这一点,但我遇到了麻烦。您要查找的内容肯定可以使用
@ComponentScan
,尽管我个人认为不将引导类保留在子包中是个坏主意。无论如何,看看更新后的答案。谢谢Manish,如果我想将存储库移动到应用程序类包层次结构之外的自己的包中,我是否被迫手动配置hibernate?我想知道为什么?我试图找到文档来解释这一点,但我遇到了麻烦。您要查找的内容肯定可以使用@ComponentScan
,尽管我个人认为不将引导类保留在子包中是个坏主意。无论如何,看看更新后的答案。您需要添加@EnableJpaRepositories(“jpa”)
和@EntityScan(“jpa”)
。默认情况下,spring引导扫描当前包,包括所有子包。因此,移动到hello.jpa
仍然会检测到这些类。但是,当您将它移到hello
包之外时,您需要手动配置它(或者将应用程序
移到一个更高的包中,该包包含hello
和jpa
,我建议您这样做)。您需要同时添加@EnableJpaRepositories(“jpa”)
和@EntityScan(“jpa”)
。默认情况下,spring引导扫描当前包,包括所有子包。因此,移动到hello.jpa
仍然会检测到这些类。但是,当您将其移动到hello
包之外时,您需要手动配置它(或者将应用程序
移动到一个更高的包中,该包包含hello
和jpa
,我建议您这样做)。