【发布时间】:2017-08-10 02:18:13
【问题描述】:
我想创建一个带有 Json 列的表格。
我得到了一个代表那个表的实体,其中代表json类型的字段使用了一个json转换器:
实体:
@Entity
public class GroupEntity {
@NotNull
private String groupId;
@Id
@NotNull
private String propertiesStr;
public GroupEntity() {
// For JPA
}
@Convert(converter = GroupPropertiesJsonConverter.class)
private HostProperties propertiesDto;
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getPropertiesStr() {
return propertiesStr;
}
public void setPropertiesStr(String propertiesStr) {
this.propertiesStr = propertiesStr;
}
public HostProperties getPropertiesDto() {
return propertiesDto;
}
public void setPropertiesDto(HostProperties propertiesDto) {
this.propertiesDto = propertiesDto;
}
}
和 GroupPropertiesJsonConverter 是:
public class GroupPropertiesJsonConverter implements
AttributeConverter<HostProperties, String> {
private static final Logger log = Logger.getLogger(GroupPropertiesJsonConverter.class);
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public String convertToDatabaseColumn(HostProperties hostProperties) {
try {
return objectMapper.writeValueAsString(hostProperties);
} catch (JsonProcessingException e) {
log.error("coudln't convert HostProperties Dto to json, wont persist");
return null;
}
}
@Override
public HostProperties convertToEntityAttribute(String dbData) {
try {
return objectMapper.readValue(dbData, HostProperties.class);
} catch (IOException e) {
log.info("couldn't convert json of properties to Dto", e);
}
return null;
}
}
和 sql 脚本:
create table group_entity (
properties_str varchar(255) not null,
group_id varchar(255) not null,
properties_dto JSON, primary key (properties_str)
);
当 spring boot 应用程序出现以下 hibernate schema 验证错误
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [properties_dto] in table [group_entity]; found [json (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)]
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateColumnType(SchemaValidatorImpl.java:105)
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:92)
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:50)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:91)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:475)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
据我了解,Hibernate 将我的 entity 字段解析为 varchar,即使我使用的是转换器注释。
将properties_dto JSON 更改为properties_dto varchar(255) 确实可以解决问题,但这不是json 类型!
我做错了什么?如何正确配置此表?
【问题讨论】:
标签: json hibernate spring-data