JavaでEnumをデータベースに保存するその他の方法
JavaでEnumをデータベースに保存する方法
エンティティクラスにEnumフィールドを追加する
エンティティクラスにEnumフィールドを追加し、@Enumerated
アノテーションを使用して保存方法を指定する方法です。
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private MyEnum myEnum;
// ...
}
public enum MyEnum {
A,
B,
C;
}
@Enumerated
アノテーションのEnumType
引数によって、保存方法を以下の2種類から選択できます。
EnumType.ORDINAL
: Enumの序数値を保存します。
カスタムEnum型を使用する
Enumの保存方法をより細かく制御したい場合は、カスタムEnum型を使用することができます。
public enum MyEnum {
A("a"),
B("b"),
C("c");
private final String code;
private MyEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
// ...
}
エンティティクラスには、カスタムEnum型のフィールドを追加します。
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private String myEnumCode;
// ...
}
MyEnum
型をデータベースに保存するには、Enum型のcode
属性を保存します。
JPAのConverterを使用する
JPAのConverterを使用すると、Enum型とデータベースのデータ型間の変換をカスタマイズすることができます。
@Converter(autoApply = true)
public class MyEnumConverter implements AttributeConverter<MyEnum, String> {
@Override
public String convertToDatabaseColumn(MyEnum attribute) {
return attribute.getCode();
}
@Override
public MyEnum convertToEntityAttribute(String dbData) {
return MyEnum.valueOf(dbData);
}
}
エンティティクラスには、@Convert
アノテーションを使用してConverterを指定します。
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@Convert(converter = MyEnumConverter.class)
private MyEnum myEnum;
// ...
}
Enumをテーブルとして保存する
Enumの要素数が少ない場合は、Enumをテーブルとして保存する方法もあります。
CREATE TABLE my_enum (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO my_enum (name) VALUES ('A');
INSERT INTO my_enum (name) VALUES ('B');
INSERT INTO my_enum (name) VALUES ('C');
エンティティクラスには、EnumのIDを保存するフィールドを追加します。
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private Long myEnumId;
// ...
}
どの方法を選択するべきか
どの方法を選択するべきかは、以下の要素を考慮する必要があります。
- Enumの要素数
- Enumの変更頻度
- データベースの構造
- パフォーマンス
Enumの要素数が少なく、変更頻度も低い場合は、エンティティクラスにEnumフィールドを追加する方法が最もシンプルです。
Enumの要素数が多い場合や、変更頻度が高い場合は、カスタムEnum型を使用したり、JPAのConverterを使用すると、コードの保守性を向上させることができます。
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private MyEnum myEnum;
// ...
}
// Enum
public enum MyEnum {
A,
B,
C;
}
// カスタムEnum型
public enum MyEnum {
A("a"),
B("b"),
C("c");
private final String code;
private MyEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
// ...
}
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private String myEnumCode;
// ...
}
// Converter
@Converter(autoApply = true)
public class MyEnumConverter implements AttributeConverter<MyEnum, String> {
@Override
public String convertToDatabaseColumn(MyEnum attribute) {
return attribute.getCode();
}
@Override
public MyEnum convertToEntityAttribute(String dbData) {
return MyEnum.valueOf(dbData);
}
}
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
@Convert(converter = MyEnumConverter.class)
private MyEnum myEnum;
// ...
}
-- テーブル作成
CREATE TABLE my_enum (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
-- データ挿入
INSERT INTO my_enum (name) VALUES ('A');
INSERT INTO my_enum (name) VALUES ('B');
INSERT INTO my_enum (name) VALUES ('C');
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private Long myEnumId;
// ...
}
EnumをStringに変換して保存する
EnumをtoString()
メソッドを使用してStringに変換し、データベースに保存する方法です。
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private String myEnum;
// ...
}
// 保存処理
MyEntity entity = new MyEntity();
entity.setMyEnum(MyEnum.A.toString());
// ...
この方法はシンプルですが、Enumの名前を変更した場合、データベースのデータも変更する必要があります。
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private int myEnum;
// ...
}
// 保存処理
MyEntity entity = new MyEntity();
entity.setMyEnum(MyEnum.A.ordinal());
// ...
この方法は、Enumの名前を変更してもデータベースのデータが変わらないというメリットがあります。ただし、Enumの順序を変更した場合、データベースのデータも変更する必要があります。
EnumをJSONに変換し、データベースに保存する方法です。
// ライブラリの追加
import com.fasterxml.jackson.databind.ObjectMapper;
// エンティティクラス
@Entity
public class MyEntity {
@Id
@GeneratedValue
private Long id;
private String myEnumJson;
// ...
}
// 保存処理
ObjectMapper mapper = new ObjectMapper();
String myEnumJson = mapper.writeValueAsString(MyEnum.A);
MyEntity entity = new MyEntity();
entity.setMyEnumJson(myEnumJson);
// ...
この方法は、Enumの情報を柔軟に保存することができます。ただし、JSONの処理にライブラリが必要になります。
- 柔軟性
Enumの要素数が少なく、変更頻度も低い場合は、EnumをStringに変換して保存する方法が最もシンプルです。
Enumの要素数が多い場合や、変更頻度が高い場合は、Enumをintに変換して保存する方法や、EnumをJSONに変換して保存する方法を選択すると、コードの保守性を向上させることができます。
java database enums