【问题标题】:How to map Duration type with JPA如何使用 JPA 映射 Duration 类型
【发布时间】:2011-02-19 06:44:22
【问题描述】:

我在javax.xml.datatype.Duration 类型的类中有一个属性字段。它基本上代表一个时间跨度(例如 4 小时 34 分钟)。

JPA 告诉我这是一个无效类型,这并没有让我感到震惊。

这有什么好的解决办法吗?我可以实现自己的 Duration 类,但我不知道如何让 JPA “接受”它作为数据类型。

【问题讨论】:

    标签: jpa time types annotations duration


    【解决方案1】:

    您可以将 Duration 类中的确切字段镜像到您自己的自定义类中,但这可能有点矫枉过正......我假设您不需要那种持续时间灵活性/粒度。

    因此,选择您想要的字段,将它们添加到您的类中,使用 @Embeddable 注释标记该类,并将正确的 JPA 注释添加到字段(我假设这将是简单的整数)。

    在您将存储持续时间的实体中,将@Embedded 注释添加到您通常使用的字段或getter。从这里您可以使用@AttributeOverride 进一步调整列定义。

    【讨论】:

    • 你是说封装 Duration 类还是从头实现一个新的类?
    • 从头开始创建自己的将是最简单的。 javax.xml.datatype.Duration 类的字段比您可能希望在 DB 表中作为列公开的字段更多,因此请创建一个具有您需要的时间粒度的自定义 Duration 对象。
    【解决方案2】:

    这有什么好的解决办法吗?我可以实现自己的 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));
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试joda-time hibernate。参考可以持久化的available types。然后您可以通过以下方式使用joda Duration:

      @Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
      private Duration startDateTime;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2021-04-24
        • 2012-01-21
        • 2021-03-07
        • 2012-02-08
        • 1970-01-01
        相关资源
        最近更新 更多