JPAエンティティのコンテキストでJava列挙型を単純に使用するときに発生する厄介な問題について説明したいと思います。この問題がどのように発生するかを見てみましょう。
最初のドメイン モデル:
テキスト (小説、ニュース記事など)Text
を表す JPA エンティティがあるとします。JPAエンティティは次のとおりです。
@Entity
public class Text {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Version
@Column(name = "version")
private Integer version;
private String content;
@Enumerated
@ElementCollection
private Set<Style> styles;
//Setters and getters omitted.
のインスタンスにはText
、斜体、太字などの 1 つまたは複数のスタイルを適用できます。スタイルは Java 列挙型として表されます。
まず、アプリケーションは次の列挙型で始まると仮定します。
public enum Style {
BOLD, ITALIC
}
以下のテストでは、リレーショナル データベースに次の行を挿入します。
統合テスト:
@Test
@Rollback(value=false)
public void inEarlyLifePersist() {
Text text =new Text();
text.setContent("This is my beautiful novel...");
text.setStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
text.persist();
}
テキスト テーブルのデータ:
# id, content, version
11, This is my beautiful novel..., 0
*text_style テーブルのデータ:*
# text, styles
11, 0
11, 1
その後、不適切な開発者が新しいスタイルを追加することを決定します:この新しい列挙型定数/値を最初のものとして配置STRIKE_THROUGH
する列挙型に:Style
public enum Style {
STRIKE_THROUGH, BOLD, ITALIC
}
そしてnew record is inserted in DB as follows
:
@Test
@Rollback(value=false)
public void afterChangeToEnumPersist() {
Text text =new Text();
text.setContent("This is my beautiful short story...");
text.setStyles(EnumSet.of(Style.STRIKE_THROUGH, Style.BOLD));
text.persist();
}
テキスト テーブル:
# id, content, version
14, This is my beautiful short story..., 0
*text_style テーブル内:*
# text, styles
14, 0
14, 1
明らかに、ドメイン モデルは深刻な状態に陥っています。
私の質問は、上記の場合のように、ドメインでスペルミスを回避するための可能な戦略は何STRIKE_THROUGH
ですか (列挙型定数を の後 に配置する明白な解決策以外ITALIC
)?
編集 1EnumType.STRING
: 明らかなパフォーマンス上の理由から、データベースに文字列 (「参考文献」を参照) を格納したくないのは明らかです。