Spring Boot 应用程序中的 H2 Schema 为空
Posted
技术标签:
【中文标题】Spring Boot 应用程序中的 H2 Schema 为空【英文标题】:H2 Schema Empty in Spring Boot Application 【发布时间】:2016-08-22 01:20:27 【问题描述】:我正在设置一个准系统 Spring Boot 项目described here,但我遇到了基本设置问题。
似乎没有调用 DatabaseLoader,当我打开这个项目的 H2 控制台时,我看不到包含 Employee 表的架构。
这是我的 pom.xml 的相关部分:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<!--
<scope>runtime</scope>
-->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
我的域名:
@Data
@Entity
public class Employee
private @Id @GeneratedValue Long id;
private String firstName;
private String lastName;
private String description;
public Employee()
public Employee(String firstName, String lastName, String description)
this.firstName = firstName;
this.lastName = lastName;
this.description = description;
还有数据库加载器: 公共类 DatabaseLoader 实现 CommandLineRunner 私有最终 EmployeeRepository 存储库;
@Autowired
public DatabaseLoader(EmployeeRepository repository)
this.repository = repository;
@Override
public void run(String... strings) throws Exception
this.repository.save(new Employee("duke", "earl", "dude"));
应用程序在 localhost:8080/console 启动后导航到控制台显示 jdbc:h2:~/test 只有一个 INFORMATION_SCHEMA 和用户菜单。我还将它设置为 CRUD 存储库,虽然我可以发布到它,但似乎没有保存任何属性数据,但可以识别员工资源。
POST:"firstName": "Bilbo", "lastName": "Baggxins", "description": "burglar"
返回:
"_links":
"self":
"href": "http://localhost:8080/api/employees/4"
,
"employee":
"href": "http://localhost:8080/api/employees/4"
【问题讨论】:
【参考方案1】:Spring Boot 的默认 h2 url 为:jdbc:h2:mem:testdb
要使用jdbc:h2:~/test
,您必须将其添加到您的application.properties
:
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:~/test
发生的事情是,您正在 spring-boot 的内存数据库 (testdb) 中写入 Employee。然后,你打开 h2-console 到jdbc:h2:~/test
,它会即时创建它,让你浏览空虚。
使用spring.h2.console.enabled=true
,您可以打开浏览器到http://localhost:8080/h2-console
并查看数据库内容。使用以下设置:
【讨论】:
这确实使控制台正常工作-谢谢!提交我的帖子会在表中创建一条记录,但名称和描述字段均为空。这可能是一个龙目岛问题,对我来说也是新问题,我现在正在调查这个问题 我现在就试试,但我几乎是从教程“React.js 和 Spring Data REST:第 1 部分”复制粘贴的,所以我不确定为什么它不会就像宣传的那样工作 我手动添加了 getter/setter 并且它起作用了。奇怪的!我会调查原因,但感谢您的帮助 顺便说一句,有没有办法打开控制台指向 jdbc:h2:mem:testdb? 我没有将 Lombok 添加到我的项目中,因为我不知道这是必要的。伙计,我在这里出类拔萃!但这确实奏效了。非常感谢您的帮助【参考方案2】:这是无耻地从乔什·朗那里借来的。这是一个有效的CommandLineRunner
实现。 Github full code
@Component
class SampleRecordsCLR implements CommandLineRunner
private final ReservationRepository reservationRepository;
@Autowired
public SampleRecordsCLR(ReservationRepository reservationRepository)
this.reservationRepository = reservationRepository;
@Override
public void run(String... args) throws Exception
Stream.of("Josh", "Jungryeol", "Nosung", "Hyobeom",
"Soeun", "Seunghue", "Peter", "Jooyong")
.forEach(name -> reservationRepository.save(new Reservation(name)));
reservationRepository.findAll().forEach(System.out::println);
【讨论】:
以上是关于Spring Boot 应用程序中的 H2 Schema 为空的主要内容,如果未能解决你的问题,请参考以下文章
无法加载驱动程序类:在 Spring Boot 应用程序中的 org.h2.Driver
使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化内存 H2
使用 MyBatis + H2 配置 Spring Boot 身份验证/登录