如何解决H2中的JSON列

我在应用程序MySQL 5.7中使用,并且具有JSON列。当我尝试运行集成测试时,由于H2数据库无法创建表,因此无法进行测试。这是错误:

2016-09-21 16:35:29.729 ERROR 10981 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: create table payment_transaction (id bigint generated by default as identity, creation_date timestamp not null, payload json, period integer, public_id varchar(255) not null, state varchar(255) not null, subscription_id_zuora varchar(255), type varchar(255) not null, user_id bigint not null, primary key (id))

2016-09-21 16:35:29.730 ERROR 10981 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : Unknown data type: "JSON"; SQL statement:

这是实体类。

@Table(name = "payment_transaction")

public class PaymentTransaction extends DomainObject implements Serializable {

@Convert(converter = JpaPayloadConverter.class)

@Column(name = "payload", insertable = true, updatable = true, nullable = true, columnDefinition = "json")

private Payload payload;

public Payload getPayload() {

return payload;

}

public void setPayload(Payload payload) {

this.payload = payload;

}

}

和子类:

public class Payload implements Serializable {

private Long userId;

private SubscriptionType type;

private String paymentId;

private List<String> ratePlanId;

private Integer period;

public Long getUserId() {

return userId;

}

public void setUserId(Long userId) {

this.userId = userId;

}

public SubscriptionType getType() {

return type;

}

public void setType(SubscriptionType type) {

this.type = type;

}

public String getPaymentId() {

return paymentId;

}

public void setPaymentId(String paymentId) {

this.paymentId = paymentId;

}

public List<String> getRatePlanId() {

return ratePlanId;

}

public void setRatePlanId(List<String> ratePlanId) {

this.ratePlanId = ratePlanId;

}

public Integer getPeriod() {

return period;

}

public void setPeriod(Integer period) {

this.period = period;

}

}

并将此转换器插入数据库:

public class JpaPayloadConverter implements AttributeConverter<Payload, String> {

// ObjectMapper is thread safe

private final static ObjectMapper objectMapper = new ObjectMapper();

private Logger log = LoggerFactory.getLogger(getClass());

@Override

public String convertToDatabaseColumn(Payload attribute) {

String jsonString = "";

try {

log.debug("Start convertToDatabaseColumn");

// convert list of POJO to json

jsonString = objectMapper.writeValueAsString(attribute);

log.debug("convertToDatabaseColumn" + jsonString);

} catch (JsonProcessingException ex) {

log.error(ex.getMessage());

}

return jsonString;

}

@Override

public Payload convertToEntityAttribute(String dbData) {

Payload payload = new Payload();

try {

log.debug("Start convertToEntityAttribute");

// convert json to list of POJO

payload = objectMapper.readValue(dbData, Payload.class);

log.debug("JsonDocumentsConverter.convertToDatabaseColumn" + payload);

} catch (IOException ex) {

log.error(ex.getMessage());

}

return payload;

}

}

回答:

提出问题后,H2添加了JSON支持,版本为1.4.200(2019-10-14)。

但是,您很少需要在数据库中使用JSON数据类型。JSON本质上只是一个可能很长的字符串,因此您可以使用大多数数据库都可用的CLOB。

如果需要对它们进行操作的SQL函数,并且仅在数据库坚持认为其JSON函数对JSON类型而不是对CLOB进行操作时,才需要JSON数据类型。但是,此类功能往往依赖于数据库。

以上是 如何解决H2中的JSON列 的全部内容, 来源链接: utcz.com/qa/433838.html

回到顶部