2015-02-08 16 views
2

這是我有:如何使用JPA保存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 

謝謝

回答

3

XMLGregorianCalendar不JPA的支持,你可以使用java.util.Datejava.util.Calendar(解釋here )。

也許你可以看看項目Hyperjaxb3(爲JAXB對象提供關係持久性)。 Here它解釋瞭如何處理時間特性:

時間屬性(類型的xsd:DATETIME,XSD:日期,XSD:時間等) 將被映射爲時間JPA屬性。 Hyperjaxb3將根據時態屬性的XML Schema 類型選擇 時態類型作爲TIMESTAMP,DATE或TIME。時間屬性通常 映射到的XMLGregorianCalendar未通過JPA支持 - 和 爲此必須包裝:

<xs:element name="dateTime" type="xs:dateTime" minOccurs="0"/> 

@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)); 
} 

另一種方法是編寫自己的解決方案,進行一些轉換而不是試圖堅持你的JAXB對象。

+0

謝謝帕特里克。我將在23小時內獎勵賞金。 – Bravo 2015-02-10 15:27:23

+1

不客氣,祝你有美好的一天! – 2015-02-10 15:29:15

0

你可以簡單地做到這一點,而不使用任何額外的框架。例如:

@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()); 
} 
0

這裏是一個工作示例:

@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(), myXMLDate.getDay()); 
    } 

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

    //...setters here 

    public MyEntity() { 
    } 
}