2009-11-21 6 views
2

좋습니다.이 질문은 코드에서 가장 잘 설명됩니다. 내가 할 수있는 가장 간결한 예를 제시하려고 노력할 것이다.Generic이있는 Hibernate 구성 요소

Timestamped.java

@Embeddable 
public class Timestamped<E> { 
    private E value; 
    private Date timestamp; 
    ... 
} 

Foo.java

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="TYPE") 
public class Foo { 
    @Embedded 
    @AttributeOverides({ 
     @AttributeOverride(name="timestamp", [email protected]("VALUE_TS")), 
     @AttributeOverride(name="value",  [email protected]("VALUE")) 
    }) 
    private TimestampedValue<E> value; 
    ... 
} 

Bar.java

@Entity 
@DiscriminatorValue("BAR") 
public class Bar extends Foo<Double> { } 

내가 필요로하는 f를 또는 Bar를 사용하여 value.value에 적합한 유형 변환기를 사용하고 Foo의 각 서브 클래스에 대해 다른 변환기를 사용하십시오. 이상적으로는이 코드를 보완하고 싶지만, 나는 Foo 추상화를 만들고 추가 주석을 사용하여 각 하위 클래스에 값 필드를 이동시킬 것입니다.

답변

1

첫 번째 방법은 작동하지 않습니다. "일반화 된"클래스는 유지할 수 없습니다.

구체화 된 서브 클래스로 value을 이동하거나 UserType을 작성하여 Timestamped 구성 요소를 유지해야합니다.

+0

값 필드를 이동하면 구성 요소 필드의 유형을 어떻게 설정합니까? @Type에 상응하는 요소를 작성하는 것에 비해 일종의 컴포넌트 필드가 있습니까? –

+1

구체적인 유형으로 선언해야합니다 (예 : 'private TimestampedValue '그리고'@ AttributeOverrides'를 사용하십시오. Hibernate는 generics를 다룰 수 없다. 그래서 당신이 유지/주석하는 모든 클래스들은 명시 적으로 타입 파라미터를 선언해야한다. 계층 구조가 큰 경우 사용자 지정 UserType을 작성하는 것이 더 나은 방법 일 수 있습니다. – ChssPly76

+0

나는 ChssPly76의 대답을 사용하는 것을 끝내었다. 그래서 foo는 이제 "TimestampedValue 값"필드를 갖습니다. –

0

많은 테이블에 해당하는 많은 클래스를 만들고 'timestamp'및 'value'속성에 대해 동일한 열 이름을 사용하는 경우 원하는 것은 '매핑 된 수퍼 클래스'이고 열이 아니라 포함 된 클래스. @MappedSuperclass 특수 효과를 연구하십시오.

+0

필드를 평평하게하면 비슷한 문제가 발생할 것이라고 생각합니다. 하지만 개체의 여러 필드에 타임 스탬프 및 관련 사용자가있을 수 있으므로 구성 요소로 유지하는 것이 좋습니다. –

+0

내장 된 슈퍼 클래스도 사용할 수 있습니다. – Jherico

0

지우기 문제가 발생했습니다. Hibernate는 실행시에 그 정보를 사용할 수 없기 때문에 제네릭 타입으로 무엇을해야하는지 알 수 없다. 그것은 좋을 것이다.

관련 문제