当使用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
答案 0 :(得分:5)
这些例外的解决方案是在实际的JPA @Column
@Type(type = "char")
private String name;
注释中设置列定义,而不是在Hibernate特定的@Column
注释中设置:
@Type
这将满足Hibernate验证器,而不会让Hibernate认为你实际上正在映射一个Character字段。