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() {
}
}