gpt4 book ai didi

java - Hibernate 模式验证失败,MySQL CHAR 映射到 String

转载 作者:行者123 更新时间:2023-11-29 01:15:48 24 4
gpt4 key购买 nike

当使用 Hibernate validator 验证 JPA 实体是否与数据库模式匹配时(通常设置 hibernate.ddl-auto = verify),当它遇到 MySQL CHAR 已映射到 String 字段。

例如,这个 MySQL 表架构:

CREATE TABLE `item` (
`id` bigint(20) NOT NULL,
`name` char(50) DEFAULT NULL,
PRIMARY KEY (`id`)
);

可以像这样映射到 JPA 实体:

@Entity
public class Item
{
@Id
private Long id;

@Column
private String name;
}

验证过程将失败,出现以下异常:

org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [name] in table [item]; found [char (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)]

一个典型的解决方案是在字段上使用 Hibernate @Type 注释来指定列数据类型,这足以满足 validator 的要求:

@Column
@Type(type = "char")
private String name;

当您实际发出需要将 ResultSet 映射到实体的查询时,您将遇到一组不同的异常(在本例中使用 Spring Data 发出查询):

org.springframework.orm.jpa.JpaSystemException: Could not set field value [B] value by reflection : [class com.example.Item.name] setter of com.example.Item.name; nested exception is org.hibernate.PropertyAccessException: Could not set field value [B] value by reflection : [class com.example.Item.name] setter of com.example.Item.name

java.lang.IllegalArgumentException: Can not set java.lang.String field com.example.Item.name to java.lang.Character

最佳答案

这些异常的解决方案是在实际的 JPA @Column 注释中设置列定义,而不是 Hibernate 特定的 @Type 注释:

@Column(columnDefinition = "char")
private String name;

这将满足 Hibernate validator 的要求,而不会混淆 Hibernate 认为您实际上正在映射字符字段。

关于java - Hibernate 模式验证失败,MySQL CHAR 映射到 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45881908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com