H2 Spring Boot - 不创建具有 LocalDateTime 属性的表

问题描述 投票:0回答:1

我有 Spring Boot 3.2 和 H2 用于开发。 H2 正在创建一些表,但不是全部。

我最初使用 MySQL 数据库开发我的项目 - 但后来在 Spring Boot 中创建了一个新的开发配置文件,并将 mem 中的数据库更改为 H2。

正是在这一点上,一些实体没有获得在H2数据库中创建的表。

例如:

健康检查

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@Data
@JsonIgnoreProperties({"hibernateLazyInitalizer", "handler"})
@SequenceGenerator(name = "health_check_seq", sequenceName = "HEALTH_CHECK_SEQ", initialValue = 100, allocationSize = 50)
@Table(name = "health_check")
public class HealthCheck {

    @Id
    @GeneratedValue(strategy = SEQUENCE, generator = "health_check_seq")
    private Long id;

    @JsonManagedReference
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    private Bird bird;
   
    @JsonManagedReference
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "healthCheck")
    private List<Task> tasks;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private LocalDateTime catchDateTime;


    @JsonBackReference
    private Point<G2D> location;

    @ManyToOne
    @JoinColumn(name = "holder_id")
    private User holder;

应用程序属性

spring.datasource.url=jdbc:h2:file:~/IdeaProjects/test/h2mem/data;MV_STORE=false;AUTO_SERVER=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.sql.init.data-locations=classpath:/datadev.sql

更新了app.props:

spring.datasource.url=jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS TEST_SCHEMA_NAME
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update

我尝试在 datadev.sql 中插入数据,但失败,因为

HEALTH_CHECK
表不存在。

StackTrace(片段)

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "
CREATE TABLE HEALTH_CHECK (
    ID BIGINT NOT NULL,
    CATCH_DATE_TIME DATETIME([*]6),
    LOCATION GEOMETRY,
    RELEASE_DATE_TIME DATETIME(6),
    BIRD_ID BIGINT NOT NULL,
    HOLDER_ID BIGINT,
    MEASURER_ID BIGINT,
    PRIMARY KEY (ID)
) ENGINE=INNODB "; expected "FOR, UNSIGNED, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, AUTO_INCREMENT, BIGSERIAL, SERIAL, IDENTITY, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, ,, )"; SQL statement:

create table health_check (
    id bigint not null,
    catch_date_time datetime(6),
    location geometry,
    release_date_time datetime(6),
    bird_id bigint not null,
    holder_id bigint,
    measurer_id bigint,
    primary key (id)
) engine=InnoDB [42001-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
at org.h2.message.DbException.getSyntaxError(DbException.java:217)
at org.h2.command.Parser.getSyntaxError(Parser.java:555)
at org.h2.command.Parser.read(Parser.java:3518)
at org.h2.command.Parser.readIfMore(Parser.java:950)
at org.h2.command.Parser.parseCreateTable(Parser.java:6571)
at org.h2.command.Parser.parseCreate(Parser.java:4615)
at org.h2.command.Parser.parsePrepared(Parser.java:380)
at org.h2.command.Parser.parse(Parser.java:335)
at org.h2.command.Parser.parse(Parser.java:311)
at org.h2.command.Parser.prepareCommand(Parser.java:278)
at org.h2.engine.Session.prepareLocal(Session.java:611)
at org.h2.engine.Session.prepareCommand(Session.java:549)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:217)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:205)
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:78)
... 41 common frames omitted
2023-09-09 08:47:22 - 

如何让H2为所有实体创建表?

java spring spring-boot hibernate h2
1个回答
0
投票

根据您提供的资源,您的代码似乎是正确的。我认为问题可能出在 application.properties 文件中。请确保您设置了以下属性:“

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update

更新课程

@Entity
@Table(name = "health_check")
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Data
public class HealthCheck {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "health_check_seq")
    @SequenceGenerator(name = "health_check_seq", sequenceName = "HEALTH_CHECK_SEQ", initialValue = 100, allocationSize = 50)
    private Long id;

    @JsonManagedReference
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "bird_id") // Make sure to specify the correct column name
    private Bird bird;

    @JsonManagedReference
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "healthCheck")
    private List<Task> tasks;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private LocalDateTime catchDateTime;

    @JsonBackReference
    @Column(columnDefinition = "geometry(Point, 4326)") // Customize this based on your database and GIS library
    private Point location;

    @ManyToOne
    @JoinColumn(name = "holder_id")
    private User holder;

    // Getter and setter methods for all fields
}
© www.soinside.com 2019 - 2024. All rights reserved.