2010-05-13 3 views
3

유형 필드에 javax.xml.datatype.Duration 인 속성 필드가 있습니다. 기본적으로 시간 범위 (예 : 4 시간 34 분)를 나타냅니다.JPA로 기간 유형을 매핑하는 방법

JPA는 잘못된 유형이므로 JPA에서 저에게 충격을주지 않습니다.

무엇이 좋은 해결책입니까? 내 자신의 Duration 클래스를 구현할 수 있지만 JPA에 데이터 유형을 "받아들이는"방법을 모르겠습니다.

답변

7

무엇이 좋은 해결책입니까? 내 자신의 Duration 클래스를 구현할 수 있지만 JPA에 데이터 유형을 "받아들이는"방법을 모르겠습니다.

JPA는 사용자 정의 유형을 지원하지 않으므로이 방법으로 이동하려면 공급자의 JPA 확장자를 사용해야합니다. 예를 들어, Hibernate는 @Type으로 선언하는 custom value types를 정의 할 수있다. 분명히, 이것은 관심사일지도 모른 공급자 사이 휴대 가능을 손상 할 것이다. 그렇지 않다면, 당신은 그것이 가능하다는 것을 압니다.

표준 JPA의 경우 전통적인 접근 방식은 문제가있는 속성을 적용하고 액세스 할 때 변환을 수행하는 다른 getter/setter 쌍을 추가하는 것입니다.

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 주석을 필드에 추가합니다 (단순한 int로 가정).

기간을 저장할 엔티티에서 일반적으로 사용하는 필드 나 getter에 @Embedded 주석을 추가하십시오. 여기에서 @AttributeOverride를 사용하여 열 정의를 추가로 조정할 수 있습니다.

+0

당신은 시간의 수업을 감싸거나 처음부터 새로 구현하는 건가요? – HDave

+1

처음부터 직접 만드는 것이 가장 쉽습니다. javax.xml.datatype.Duration 클래스는 더 많은 필드를 가지고 있으며, DB 테이블의 컬럼으로 드러내 길 원할 것입니다. 그래서 필요한 시간 단위로 커스텀 Duration 객체를 생성하십시오. – Jeff

1

당신은 joda-time hibernate을 시도해 볼 수도 있습니다 : 나는 시간을 저장하는 Long을 사용합니다. 지속될 수있는 available types을 참조하십시오. 그런 다음 다음과 같은 방법으로 joda Duration을 사용할 수

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