Как сопоставить тип длительности с JPA - PullRequest
4 голосов
/ 14 мая 2010

У меня есть поле свойства в классе типа javax.xml.datatype.Duration. Это в основном представляет собой промежуток времени (например, 4 часа и 34 минуты).

JPA говорит мне, что это недопустимый тип, что меня не шокирует.

Какое это хорошее решение? Я мог бы реализовать свой собственный класс Duration, но я не знаю, как заставить JPA «принять» его как тип данных.

Ответы [ 3 ]

7 голосов
/ 14 мая 2010

Какое это хорошее решение? Я мог бы реализовать свой собственный класс Duration, но я не знаю, как заставить JPA «принять» его как тип данных.

JPA не поддерживает пользовательские типы, поэтому, если вы хотите пойти по этому пути, вам придется использовать расширение JPA от вашего провайдера. Например, Hibernate позволяет определять пользовательских типов значений , которые вы объявляете с помощью @Type. Очевидно, что это повредит переносимости между провайдерами, что может быть проблемой. Если нет, то вы знаете, что это выполнимо.

В стандартном JPA традиционный подход заключается в добавлении еще одной пары геттер / сеттер, которая адаптирует проблемное свойство и выполняет преобразование при доступе. Я бы использовал 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 голос
/ 01 сентября 2010

Вы можете попробовать Joda-Time Hibernate . Обратитесь к доступным типам , которые можно сохранить. Затем вы можете использовать joda Duration следующим образом:

@Type(type="org.joda.time.contrib.hibernate.PersistentDuration")
private Duration startDateTime;
1 голос
/ 14 мая 2010

Вы можете зеркально отразить точные поля в классе Duration в своем собственном пользовательском классе, но это может быть излишним ... Я предполагаю, что вам не нужна такая гибкость / детализация продолжительности.

Итак, выберите нужные поля, добавьте их в свой класс, пометьте класс аннотацией @Embeddable и добавьте в поля надлежащие аннотации JPA (я предполагаю, что это будут простые целые числа).

В вашей сущности, в которой будет храниться длительность, добавьте аннотацию @Embedded к полю или получателю, в зависимости от того, что вы обычно используете. Отсюда вы можете дополнительно настроить определения столбцов с помощью @ AttributeOverride.

...