Hibernate架构验证失败,MySQL CHAR映射到String

时间:2017-08-25 12:53:23

标签: java mysql hibernate jpa

当使用Hibernate验证器验证JPA实体是否与数据库架构匹配时(通常是设置hibernate.ddl-auto = verify)当它遇到已映​​射到{{1}的MySQL CHAR时,它将失败} field。

例如,这个MySQL表架构:

String

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

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

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

  

org.hibernate.tool.schema.spi.SchemaManagementException:   模式验证:列[name]中遇到错误的列类型   表[item];找到[char(Types#CHAR)],但是期待[varchar(255)   (类型#VARCHAR)]

对此的典型解决方案是在字段上使用Hibernate @Entity public class Item { @Id private Long id; @Column private String name; } 注释来指定列数据类型,这足以满足验证器:

@Type

当您实际发出需要将ResultSet映射到实体的查询时,您将遇到一组不同的异常(在这种情况下,Spring Data用于发出查询):

  

org.springframework.orm.jpa.JpaSystemException:无法设置字段   反射的值[B]值:[class com.example.Item.name] setter   com.example.Item.name;嵌套异常是   org.hibernate.PropertyAccessException:无法设置字段值[B]   反射值:[class com.example.Item.name] setter of   com.example.Item.name

  

java.lang.IllegalArgumentException:无法将java.lang.String字段com.example.Item.name设置为java.lang.Character

1 个答案:

答案 0 :(得分:5)

这些例外的解决方案是在实际的JPA @Column @Type(type = "char") private String name; 注释中设置列定义,而不是在Hibernate特定的@Column注释中设置:

@Type

这将满足Hibernate验证器,而不会让Hibernate认为你实际上正在映射一个Character字段。