2010-05-13 78 views
3

來映射持續時間類型我有一個javax.xml.datatype.Duration類型的屬性字段。它基本上代表了時間跨度(例如4小時和34分鐘)。如何使用JPA

JPA告訴我這是一種無效的類型,它不會讓我感到震驚。

這是一個很好的解決方案嗎?我可以實現我自己的Duration類,但我不知道如何讓JPA將它「接受」爲數據類型。

回答

7

這是一個很好的解決方案嗎?我可以實現我自己的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)); 
    } 
} 
1

您可以將Duration類中的確切字段映射到您自己的自定義類中,但這可能會矯枉過正......我假設您不需要這種持續時間靈活性/粒度。所以選擇你想要的字段,將它們添加到你的類,用@Embeddable註釋標記類,並添加適當的JPA註釋到字段(我假設將是簡單的整數)。

在您的存儲持續時間的實體中,將@Embedded註釋添加到字段或getter中,無論您通常使用哪個。從這裏你可以用@AttributeOverride進一步調整列定義。

+0

你是說包Duration類或從頭開始實現一個新的? – HDave 2010-05-14 01:39:44

+1

從頭創建自己將是最簡單的。 javax.xml.datatype.Duration類具有更多字段,因此您可能希望將其公開爲數據庫表中的列,因此只需要您需要的時間粒度即可創建自定義Duration對象。 – Jeff 2010-05-14 13:57:31