如何使用 JPA 持久保存 XMLGregorianCalendar?

Bra*_*avo 2 soap hibernate cxf

这就是我所拥有的:

@XmlSchemaType(name = "dateTime")
@Column(name = "expiry-date", nullable = false)
protected XMLGregorianCalendar expiryDate;
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

org.hibernate.MappingException: Could not determine type for: javax.xml.datatype.XMLGregorianCalendar
Run Code Online (Sandbox Code Playgroud)

谢谢

Lea*_*edo 5

XMLGregorianCalendarJPA 不支持,您可以使用java.util.Dateor (此处java.util.Calendar解释)。

也许您可以看一下Hyperjaxb3项目(为 JAXB 对象提供关系持久性)。 这里解释了如何处理时间属性:

时间属性(类型为 xsd:dateTime、xsd:date、xsd:time 等)将映射为时间 JPA 属性。Hyperjaxb3 将根据时间属性的 XML 模式类型选择时间类型为 TIMESTAMP、DATE 或 TIME。时间属性通常映射到 JPA 不支持的 XMLGregorianCalendar - 因此必须进行包装:

<xs:element name="dateTime" type="xs:dateTime" minOccurs="0"/>
Run Code Online (Sandbox Code Playgroud)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar dateTime;
@Transient
public XMLGregorianCalendar getDateTime() {
    return dateTime;
}
public void setDateTime(XMLGregorianCalendar value) {
    this.dateTime = value;
}
@Basic
@Column(name = "DATETIMEITEM")
@Temporal(TemporalType.TIMESTAMP)
public Date getDateTimeItem() {
    return XmlAdapterUtils.unmarshall(XMLGregorianCalendarAsDateTime.class, this.getDateTime());
}

public void setDateTimeItem(Date target) {
    setDateTime(XmlAdapterUtils.marshall(XMLGregorianCalendarAsDateTime.class, target));
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是编写您自己的解决方案,执行一些转换,而不是尝试保留您的 JAXB 对象。