【问题标题】:Why Hibernate doesn't initialize data?为什么 Hibernate 不初始化数据?
【发布时间】:2017-05-31 06:21:55
【问题描述】:

我有一个简单的带有 H2 内存数据库的 Spring Boot 应用程序并尝试初始化数据。

这是我的 application.config:

#Database connection
spring.datasource.url=jdbc:h2:mem:practice_db
spring.datasource.username=sa
spring.datasource.password=123456
spring.datasource.driverClassName=org.h2.Driver

#spring.datasource.initialize=true
#spring.datasource.schema=schema.sql
#spring.datasource.data=schema.sql


#Hibernate configuration
#spring.jpa.hibernate.ddl-auto = none

schema.sql

CREATE TABLE IF NOT EXISTS `Person` (
    `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
    `first_name` VARCHAR(50) NOT NULL,
    `age`        INTEGER  NOT NULL
);

INSERT INTO `Person` (`first_name`, `age`) VALUES ('Peter', 20);

和data.sql

INSERT INTO `Person` (`first_name`, `age`) VALUES ('John', 20);

这是我的实体

/**
 * Dummy data model.
 * Just for test
 */
@Entity
@Table(name = "Person")
public class Person {

    @Id
    @GeneratedValue
    @Column(name = "Id")
    private Long id;

    /**
     * For hibernate
     */
    @Version
    private Integer version;

    /**
     * Person name
     */
    @Basic(optional = false)
    @Column(name = "first_name")
    private String name;

    /**
     * Age. Primitive type can't be nullable
     */
    @Basic(optional = false)
    @Column(name = "age")
    private int age;

表 'Person' 已成功创建。但是它没有数据,虽然脚本被执行了:

09:06:29.711 5823 [main] INFO  o.s.j.datasource.init.ScriptUtils - Executing SQL script from URL [file:/C:/Users/User/Desktop/students/materials/practice/target/classes/schema.sql]
09:06:29.732 5844 [main] INFO  o.s.j.datasource.init.ScriptUtils - Executed SQL script from URL [file:/C:/Users/User/Desktop/students/materials/practice/target/classes/schema.sql] in 21 ms.
09:06:29.742 5854 [main] INFO  o.s.j.datasource.init.ScriptUtils - Executing SQL script from URL [file:/C:/Users/User/Desktop/students/materials/practice/target/classes/data.sql]
09:06:29.748 5860 [main] INFO  o.s.j.datasource.init.ScriptUtils - Executed SQL script from URL [file:/C:/Users/User/Desktop/students/materials/practice/target/classes/data.sql] in 1 ms.
09:06:29.915 6027 [main] INFO  o.s.o.j.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'default'
09:06:29.949 6061 [main] INFO  o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [

当应用程序运行时,从这个表中写入和读取数据工作正常。

如何在应用程序启动时初始化数据?

【问题讨论】:

  • @Afridi 我没有 PersonRepository。我使用 EntityManager.persist 将数据保存在应用程序中。 g00glen00b 说他需要带有 INSERT 语句的 data.sql 文件。我有这样的文件,但由于某种原因它不起作用

标签: hibernate spring-boot h2


【解决方案1】:

根据 Spring 文档,Hibernate 具有以下默认值:

spring.jpa.hibernate.ddl-auto= # DDL mode。这实际上是hibernate.hbm2ddl.auto 属性的快捷方式。使用嵌入式数据库时默认为create-drop,否则为“无”。

因此,对于嵌入式数据库,您的 SQL 脚本会启动,然后 Hibernate 会删除数据库并根据您的模型重新创建架构。因此,您再也看不到插入了。

作为一种解决方案,您可以在 application.properties 中设置 spring.jpa.hibernate.ddl-auto=none

【讨论】:

  • DML 和 DDL 操作都正确执行(使用 Spring JDBC),但是在 Hibernate 到来之后,删除模式并启动它自己的 DDL 操作。因此,原始的 DML 记录会丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多