1

enumデータ モデルから DDL を生成するときに定義されたフィールドのドメインを生成する方法はありますか?

として定義されているフィールドのデフォルトの動作enumは、EnumType.STRINGまたはEnumType.ORDINALです。この特定のケースでは、 を使用します@Enumerated(EnumType.STRING)

MyEnum.java

public enum MyEnum {
   MY_VALUE_1, MY_VALUE_2, MY_VALUE_3
}

MyEntity.java

@javax.persistence.Entity
public class MyEntity {
   @javax.persistence.Id
   private long id;

   @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
   private MyEnum status;
}

残念ながら、これは「のみ」と定義されていcharacter varying(255)ます (私は PostgreSQL RDBMS を使用しています)。

ALTER TABLE myentity ADD COLUMN status character varying(255);

これはもちろん、実際の とは関係のないゴミをそこに置く機会を与えますenum

INSERT INTO myentity(id, status) VALUES (1, 'THIS_HAS_NOTHING_TO_DO_WITH_THE_ENUM');

この場所で、Hibernate にヒントを与えて、実際に列挙に属する値のみが許可されたドメインを生成できるようにしたいと考えています。

@Check回避策として、注釈を使用してチェック制約を生成したいと考えました。ただし、これは残念ながら動的に行うことはできません。MyEnum.values()列挙型が追加の値を取得するときに同時に変更する必要がないように、このチェックを生成するためにをループしたかったのです。

public class MyEntity {
   @javax.persistence.Id
   private long id;

   @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
   @org.hibernate.annotations.Check(constraints = String.format("currentclub in %s", PlayerStatus.values()))
   private MyEnum status;
}

もちろん、これは構文エラーにつながります

注釈属性 Check.constraints の値は定数式でなければなりません。

コンパイル時に属性値を決定する必要があるため、これは明らかです。

巧妙な方法でそれを行う他の方法はありますか?

4

0 に答える 0