Issue
I am using H2 inMemory database for my springboot application. Where I have enabled hibernate.ddl-auto
. Below is the application.yml
content:
spring:
profiles: mock
jpa:
database-platform: org.hibernate.dialect.H2Dialect
generate-ddl: true
hibernate:
ddl-auto: create
datasource:
jdbcUrl: jdbc:h2:mem:master
driver-class-name: org.h2.Driver
username:
password:
maximumPoolSize: 10
minimumIdle: 5
idleTimeout: 6000
maxLifetime: 12000
leakDetectionThreshold: 18000
poolName: "primary"
and my entity class has an enumerated attribute as:
@Column(name = "SOURCE", columnDefinition = "default 'MOBILE_APP'")
@Enumerated(EnumType.STRING)
private DocSource source;
spring throwing Unknown data type: DEFAULT
exception while it's creating a schema for the above entity as its taking dataType as "Default" from columnDefinition = "default 'MOBILE_APP'"
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Unknown data type: "DEFAULT"; SQL statement:
create table DMS_CUSTOMER_DOCUMENT_REF (ID bigint generated by default as identity, APPLICATION_ID varchar(255), CREATED_DATE timestamp, CUSTOMER_DOC_TYPE_ID bigint, DMS_DOC_ID varchar(255), DOC_VIEW default 'FRONT', IS_DELETED boolean, SOURCE default 'MOBILE_APP', primary key (ID)) [50004-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.command.Parser.parseColumnWithType(Parser.java:5971)
at org.h2.command.Parser.parseColumnForTable(Parser.java:5697)
at org.h2.command.Parser.parseTableColumnDefinition(Parser.java:8442)
at org.h2.command.Parser.parseCreateTable(Parser.java:8379)
at org.h2.command.Parser.parseCreate(Parser.java:6276)
at org.h2.command.Parser.parsePrepared(Parser.java:903)
at org.h2.command.Parser.parse(Parser.java:843)
at org.h2.command.Parser.parse(Parser.java:815)
at org.h2.command.Parser.prepareCommand(Parser.java:738)
at org.h2.engine.Session.prepareLocal(Session.java:657)
at org.h2.engine.Session.prepareCommand(Session.java:595)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235)
at org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:164)
at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:126)
at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:120)
at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java)
Is there a way where H2 will convert these types of column definitions in a correct way?
Solution
Try to correct your field definition in this way:
@Column(name = "SOURCE", columnDefinition = "VARCHAR(20) default 'MOBILE_APP'")
@Enumerated(EnumType.STRING)
private DocSource source;
columnDefinition
will override the sql DDL generated by hibernate for this particular column, but please note that it is non portable and depends on database you use.
So, as an alternative you can use @ColumnDefault annotation:
@Entity
@DynamicInsert
public class YourEntity
{
// ...
@Column(name = "SOURCE")
@ColumnDefault("'MOBILE_APP'")
@Enumerated(EnumType.STRING)
private DocSource source;
}
See also this section of hibernate documentation.
Answered By - SternK