我在应用程序初始化时将数据加载到内存数据库中时遇到问题。我已经创建 schema.sql文件 和 data.sql 含有表结构和初始数据文件。
schema.sql:
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(64) NOT NULL, password VARCHAR(64) );
和 data.sql :
INSERT INTO users (id, username, password) VALUES (1, 'usr1', 'bigSecret'), (2, 'usr2', 'topSecret');
我正在使用JpaRepository数据层:
JpaRepository
public interface UserRepository extends JpaRepository<User, Long> { }
而且我还配置了 application.properties
spring.datasource.initialize=true spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
但是当我打电话
List<User> users = userRepository.findAll();
用户实体
@Entity @Table(name = "users") public class User { @Id @GeneratedValue private Long id; private String username; private String password; public User() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
我得到一个空列表,但是应该从内存中的H2数据库中获得两个预先填充的用户。内存数据库有什么问题?谢谢。
您始终可以尝试按照h2的规范运行这些脚本,在该脚本中应在连接URL中添加INIT脚本(作为选项之一):
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'"
此功能通过INIT属性启用。请注意,可以将多个命令传递给INIT,但是必须转义分号分隔符,如下例所示。
更新资料
请注意application.properties:
application.properties
spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=true spring.datasource.initialize=true
在启动过程中可能会引起一些冲突。因此,您应该始终瞄准一个目标,但不要同时瞄准两个目标。对于简单的情况,仅这些就足以自动构建表并在关机和启动后重新加载