JPA列挙タイプフィールドの挿入


JPAはエニュメレート・タイプフィールドを挿入します.(1)エニュメレート・ワードの値を挿入します.(2)エニュメレート・シーケンス番号を挿入します.(3)エニュメレート・ユーザー定義の値を挿入します.
例えば、列挙類があります.
public enum Gender {
    BOY("1" , "boy" , "Boy");
    GIRL("2" , "girl" , "Girl");

    private int value;
    private String s1;
    private String s2;

    //....  
}
 
1.列挙名の値を挿入する文字列
BOYまたはGIRLを表に入れます.エンティティフィールドは以下の通りです.
public class Staff {

    @Enumerated(EnumType.STRING)
    private Gender gender;
    //...  
}
2.列挙の番号を挿入する、すなわちordinalです.
ordinalとは、クラスで列挙の順番を定義し、0から始まるという意味です.このような方式はあまり使われていません.クラスメートが列挙類を修正したので、業務の異常を引き起こしやすいです.
また、JPAのデフォルト方式(@Emmerated注を付けない)はこのようです.
例えば、BOYを表に入れます.このような方式は0に預け入れます.このような方法では、GIRLを表に保存します.
public class Staff {

    @Enumerated(EnumType.ORDINAL)
    private Gender gender;
    //...  
}
3.列挙のユーザー定義値を挿入する
たとえば:
public enum Gender {
    BOY("1" , "boy" , "Boy");
    Girl("2" , "girl" , "Girl");

    private int value;
    private String s1;
    private String s2;

    //....  
}
BOYの数字1または「boy」または「Boy」を表に入れたい場合、JPAはデフォルトではサポートされていません.特定のインターフェースを実現するためにクラスをカスタマイズする必要があります.
コードを例にとって、コメントをよく見てください.もしBOYの1を表に入れたいなら、
public class GenderConverter implements AttributeConverter{

    /**
     * convertToDatabaseColumn          
     *     Gender    value    
     */
	@Override
	public Integer convertToDatabaseColumn(Gender attribute) {
		if(attribute == null){
			throw new RuntimeException("Unknown Gender text : " + attribute);
		}
		return attribute.getValue();
	}

    /**
     * convertToEntityAttribute              
     *           value    gender  
     */
	@Override
	public Gender convertToEntityAttribute(Integer dbData) {
		for(Gender s : Gender.values()){
			if(s.getValue() == (dbData)){
				return s;
			}
		}
		throw new RuntimeException("Unknown Gender text : " + dbData);
	}
	
}
インスタンスクラス:
public class Staff {
    
   /**
    *    @Convert         GenderConverter
    *   JPA           Gender       
    */
    @Convert(converter = GenderConverter.class)
    private Gender gender;
    //...  
}