我正在尝试使用内存数据库编写测试。 我编写了一个SQL来清理数据并将其存储到DB。但我有一个例外:
Caused by: org.h2.jdbc.JdbcSQLDataException: Hexadecimal string contains non-hex character: "e7485042-b46b-11e9-986a-b74e614de0b0"; SQL statement:
insert into users (user_id, name, created_on, modified_on) values ('e7485042-b46b-11e9-986a-b74e614de0b0', 'Ann', null, null) -- ('e7485042-b46b-11e9-986a-b74e614de0b0', 'Ann', NULL, NULL) [90004-199]
我的SQL:
insert into users (user_id, name, created_on, modified_on) values ('e7485042-b46b-11e9-986a-b74e614de0b0', 'Ann', null, null);
insert into product(product_id, name, created_on, modified_on) VALUES ('f3a775de-b46b-11e9-95e4-af440b6044e6', 'product1', '2019-08-01 17:51:51.000000', '2019-08-01 17:51:51.000000');
insert into products_users(user_id, product_id) VALUES ('e7485042-b46b-11e9-986a-b74e614de0b0', 'f3a775de-b46b-11e9-95e4-af440b6044e6');
我的application.properties:
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
答案 0 :(得分:2)
使用 spring.datasource.url = jdbc:h2:mem:testdb; MODE = MYSQL 为我修复了该问题。
或在UUID字段中添加注释@Type可以解决此问题:
@Id
@Type(type="uuid-char")
private UUID user_id;
答案 1 :(得分:0)
此问题的实际原因是您的对象与hibernate(create table
)所生成的ddl-auto:create
语句之间的映射,该语句用于创建h2数据库架构。
如果使用以下命令启用这些ddl
语句的输出:
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type=TRACE
您很可能会看到您的UUID
类已映射到数据库中的 binary 列。
Hibernate:
create table <your_table> (
id bigint generated by default as identity,
...,
<your_object> binary(255),
...
primary key (id)
)
这意味着您的uuid字符串包含非法字符。您需要一个varchar(<uuid-length>)
列。解决方案策略有几种,其中一种是定义类型,请参见StackOverflow answer。您可以在官方MySQL reference site的binary
列上阅读。
答案 2 :(得分:-1)
我通过将spring.jpa.hibernate.ddl-auto=none
添加到我的application.properties
文件中来解决了这个问题