5

静的データを格納するために列挙型でマップしようとしているトリッキーなことがあります。

次のように宣言された列挙型クラスから始まります。

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;
}
}

今、私はこれらを次のように使用したいと思います:

List<MyInterface> elements

問題は、コレクションのマッピングにあります。EnumType.STRING で @Enumerated を永続化することで得られる文字列値だけでなく、永続化される列挙型のクラスを記述するために作成した CompositeUserType を使用すると、これらを正常に永続化できます。そのような場合、次のように宣言できます。


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

その場合、問題なく永続化できますが、コレクションで @Type を使用すると、そのコレクション内のすべてのアイテムがそのカスタム型を使用して永続化されるかどうかはわかりません。埋め込み可能なので、 @ElementCollection も使用する必要がありますか? それとも、コレクションの targetClass として作成したユーザー タイプ クラスを使用しますか? そのようなものに対してどのように機能するかについて、私は少し混乱しています。おそらくコレクション内で A または B を永続化するのに十分な汎用性を維持したいと考えています (ただし、永続化されたエンティティごとに 1 つのタイプになるだけですが、いずれかである可能性があります)。

変更されない静的データであるため、これをエンティティクラスとして設定する必要はありませんが、将来的に別の列挙型になる新しいバージョンが存在する可能性があります。

4

1 に答える 1

1

Hibernateはそのままではサポートしていませんが、com.package.Type.ENUM_VALUEのように、完全修飾列挙型名を格納する独自のユーザータイプを作成できます。ユーザータイプを使用して、1つの値/オブジェクトを複数のデータベース列にマップできるかどうかはわかりません。

ここに、列挙型を格納するためのユーザータイプの例があります。この例では列挙型を格納するだけですが、テンプレートとして使用できる場合があります。

于 2011-04-28T23:13:44.270 に答える