移动 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 ...
我也被这个问题搞糊涂了。我在 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.
我能够直接从网站获得示例应用程序 运行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 ...
我也被这个问题搞糊涂了。我在 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.