2011-04-28 1 views
4

정적 데이터를 저장하기 위해 Enum과 매핑하려고하는 까다로운 작업이 있습니다.매핑 인터페이스를 구현하는 Enum 형식 컬렉션

이 같은 선언 열거 클래스를 시작합니다 : 문제는 컬렉션 매핑에 제공

List<MyInterface> elements

:

interface MyInterface { 
    String getName(); 
} 

public enum A implements MyInterface { 
FIRST_A("First A"); 
private final String name; 
private A(String name) { 
this.name = name; 
} 
public String getName() { 
return name; 
} 

public String toString() { 
return name; 
} 
} 

public enum B implements MyInterface { 
FIRST_B("First B"); 
private final String name; 
private B(String name) { 
this.name = name; 
} 
public String getName() { 
return name; 
} 

public String toString() { 
return name; 
} 
}

은 지금은 이러한를 사용하고 싶습니다. 나는 EnumType.STRING으로 @Enumerated를 지속 할 때 오는 String 값뿐만 아니라 지속되는 enum의 클래스를 작성하기 위해 작성한 CompositeUserType을 사용하면 정상적으로 잘 유지할 수 있습니다. 이 경우


@Type(type="MyCustomEnumType.class") 
@Columns(columns = { 
      @Column(name = "enumValue"), @Column(name = "enumClass") 
}) 
private Enum enumValue;

내가 그들을 잘 유지 할 수 있지만, 컬렉션 @type를 사용하면 해당 사용자 지정 형식을 사용하여 영속화 해당 모음 내의 모든 항목을 만들 것입니다 있을지 불확실 해요 : 이러한 경우에 나는 선언 할 수 있습니다. @ElementCollection도 embeddable과 같으므로 사용해야합니까? 또는 내가 작성한 사용자 유형 클래스를 콜렉션의 targetClass로 사용합니까? 나는 그런 식으로 어떻게 작동하는지 약간 혼란 스럽다. 나는 컬렉션에 A 또는 B를 유지하기에 충분히 일반화하고 싶다. (비록 엔티티 당 오직 하나의 타입이 될 것이지만 둘 중 하나 일 수도있다.)

변경하지 않는 정적 데이터이기 때문에 이것을 Entity 클래스로 설정하지 않아도되지만 나중에 다른 열거 형이 될 새 버전이있을 수 있습니다.

+0

JPA는 인터페이스 필드 또는 컬렉션을 지원하지 않습니다. DataNucleus

답변

1

Hibernate는 기본적으로 지원하지 않지만 자신 만의 usertype을 작성하여 완전한 Enum 이름 (예 : com.package.Type.ENUM_VALUE)을 저장할 수 있습니다. 사용자 유형을 사용하여 하나의 값/객체를 둘 이상의 데이터베이스 열에 매핑 할 수 있는지 여부는 알 수 없습니다.

enum을 저장하는 usertype의 예가 here입니다. 이 예제는 열거 형을 저장하지만 템플리트로 사용할 수 있습니다.

+1

정확히 그 것을 작성했지만, 한 단계 더 나아가 확장중인 인터페이스로 선언 된 콜렉션이 있습니다. 심지어 열거 형 일 수도 있습니다. 내가 가지고있는 문제는 컬렉션이 열거 형을 저장하기 위해 내 사용자 정의 유형을 사용하게 만드는 방법을 찾는 것입니다. @Type에 내 사용자 정의 유형을 사용할지 또는 @ElementCollection의 targetClass를 사용해야하는지 여부는 확실하지 않습니다. – kjordan