2010-05-13 35 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