Hibernate 如何将XMLGregorianCalendar与JPA保持一致?

Hibernate 如何将XMLGregorianCalendar与JPA保持一致?,hibernate,soap,cxf,Hibernate,Soap,Cxf,这就是我所拥有的: @XmlSchemaType(name = "dateTime") @Column(name = "expiry-date", nullable = false) protected XMLGregorianCalendar expiryDate; 将引发以下异常: org.hibernate.MappingException: Could not determine type for: javax.xml.datatype.XMLGregorianCalendar 谢谢

这就是我所拥有的:

@XmlSchemaType(name = "dateTime")
@Column(name = "expiry-date", nullable = false)
protected XMLGregorianCalendar expiryDate;
将引发以下异常:

org.hibernate.MappingException: Could not determine type for: javax.xml.datatype.XMLGregorianCalendar

谢谢

XMLGregorianCalendar
不受JPA支持,您可以使用
java.util.Date
java.util.Calendar
(已解释)

也许您可以看看这个项目(为JAXB对象提供关系持久性)。 下面介绍了如何处理时间属性:

时态属性(键入xsd:dateTime、xsd:date、xsd:time等) 将映射为时态JPA属性。Hyperjaxb3将选择 时间类型,如时间戳、日期或时间,具体取决于XML模式 时态属性的类型。时间属性通常是 映射到JPA不支持的XMLGregorianCalendar上-和 因此,必须包装:


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

您可以不使用任何额外的框架就这么做。例如:

@Transient
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar expiryDate;

@Column(name = "expiry-Date", nullable = false)
public Calendar getExpiryDateToCalendar() {
    return new GregorianCalendar(expiryDate.getYear(), expiryDate.getMonth(), expiryDate.getDay());
}

下面是一个工作示例。您还应该注意代码中的月份,如XMLGregoriaCalendar中的月份定义为从1到12,但在日历中是从0到11

@Entity
@Access(AccessType.FIELD)
@Table(name="test_my_entity")
public class MyEntity {

    @Id
    @GeneratedValue
    private Long id;

    @XmlAttribute(name = "name")
    @Transient
    protected String name;

    @XmlSchemaType(name = "dateTime")
    @Transient
    protected XMLGregorianCalendar myXMLDate;

    @Transient
    private Calendar calendarDate;

    @Access(AccessType.PROPERTY)
    @Column(name = "calendar_date")
    private Calendar getCalendarDate() {
        return new GregorianCalendar(myXMLDate.getYear(), myXMLDate.getMonth()-1, myXMLDate.getDay());
    }

    @Access(AccessType.PROPERTY)
    @Column(name = "my_str_name")
    public String getName() {
        return "My string";
    }

    //...setters here

    public MyEntity() {
    }
}
@Transient
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar expiryDate;

@Column(name = "expiry-Date", nullable = false)
public Calendar getExpiryDateToCalendar() {
    return new GregorianCalendar(expiryDate.getYear(), expiryDate.getMonth(), expiryDate.getDay());
}
@Entity
@Access(AccessType.FIELD)
@Table(name="test_my_entity")
public class MyEntity {

    @Id
    @GeneratedValue
    private Long id;

    @XmlAttribute(name = "name")
    @Transient
    protected String name;

    @XmlSchemaType(name = "dateTime")
    @Transient
    protected XMLGregorianCalendar myXMLDate;

    @Transient
    private Calendar calendarDate;

    @Access(AccessType.PROPERTY)
    @Column(name = "calendar_date")
    private Calendar getCalendarDate() {
        return new GregorianCalendar(myXMLDate.getYear(), myXMLDate.getMonth()-1, myXMLDate.getDay());
    }

    @Access(AccessType.PROPERTY)
    @Column(name = "my_str_name")
    public String getName() {
        return "My string";
    }

    //...setters here

    public MyEntity() {
    }
}