來映射持續時間類型我有一個javax.xml.datatype.Duration
類型的屬性字段。它基本上代表了時間跨度(例如4小時和34分鐘)。如何使用JPA
JPA告訴我這是一種無效的類型,它不會讓我感到震驚。
這是一個很好的解決方案嗎?我可以實現我自己的Duration類,但我不知道如何讓JPA將它「接受」爲數據類型。
來映射持續時間類型我有一個javax.xml.datatype.Duration
類型的屬性字段。它基本上代表了時間跨度(例如4小時和34分鐘)。如何使用JPA
JPA告訴我這是一種無效的類型,它不會讓我感到震驚。
這是一個很好的解決方案嗎?我可以實現我自己的Duration類,但我不知道如何讓JPA將它「接受」爲數據類型。
這是一個很好的解決方案嗎?我可以實現我自己的Duration類,但我不知道如何讓JPA將它「接受」爲數據類型。
JPA不支持自定義類型,所以如果你想這樣做,你將不得不從你的提供者使用JPA擴展。例如,Hibernate允許您定義您使用@Type
聲明的custom value types。顯然,這會損害可能成爲問題的提供者之間的可移植性。如果沒有,那麼你知道這是可行的。
對於標準的JPA,傳統的方法是添加另一個getter/setter對,它適應有問題的屬性並在訪問時執行轉換。我會用一個Long
存儲的持續時間:
public MyEntity implements Serializable {
private Long id;
private javax.xml.datatype.Duration duration;
@Id
@GeneratedValue
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Transient
public Duration getDuration() {
return this.duration;
}
public void setDuration(Duration duration) {
this.duration = duration;
}
public Long getDurationAsJpaCompatibleType() {
return MyXmlUtil.convertDurationToLong(this.duration);
}
public void setDurationAsJpaCompatibleType(Long duration) {
setDuration(MyXmlUtil.convertLongToDuration(duration));
}
}
您可以將Duration類中的確切字段映射到您自己的自定義類中,但這可能會矯枉過正......我假設您不需要這種持續時間靈活性/粒度。所以選擇你想要的字段,將它們添加到你的類,用@Embeddable註釋標記類,並添加適當的JPA註釋到字段(我假設將是簡單的整數)。
在您的存儲持續時間的實體中,將@Embedded註釋添加到字段或getter中,無論您通常使用哪個。從這裏你可以用@AttributeOverride進一步調整列定義。
你可以嘗試joda-time hibernate。請參閱可持續的available types。然後,您可以通過以下方式使用joda Duration:
@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;
你是說包Duration類或從頭開始實現一個新的? – HDave 2010-05-14 01:39:44
從頭創建自己將是最簡單的。 javax.xml.datatype.Duration類具有更多字段,因此您可能希望將其公開爲數據庫表中的列,因此只需要您需要的時間粒度即可創建自定義Duration對象。 – Jeff 2010-05-14 13:57:31