我有 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为所有实体创建表?
根据您提供的资源,您的代码似乎是正确的。我认为问题可能出在 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
}