2015-04-14 4 views
3

Я хотел бы сохранить и получить специальные символы (/, * и т. Д.) В таблицу DB. Это моя попытка:Сохранение специальных символов в типе данных Enum

public enum SpecialCharacters { 
    Hack("H/K"), Gk("G*M"); 

    private String value; 

    private SpecialCharacters(String value) { 
     this.value = value; 
    } 

    public String toString() { 
     return this.value; // This will return , # or + 
    } 
} 

@Column(name = "Special_Char") 
@Enumerated(EnumType.STRING) 
private SpecialCharacters specialCharacters; 
... 

Но в таблице БД он хранит только перечисления имен полей, как Hack и Gk, не H/K и G * M

+0

Почему вы думаете, хранить имена перечислений не так? – Seelenvirtuose

+0

Не можете ли вы использовать значение, возвращаемое 'toString' из извлеченного перечисления? – Reimeus

ответ

1

С @Enumerated Аннотации вы можете сохранить только имя или порядковый номер вашего перечисления. С JPA 2.1 вы можете использовать аннотацию @Converter.

См. Главу 11.1.10 раздела specification.

Пример:

Enum:

public enum SpecialCharacter { 
    Hack("H/K"), 
    Gk("G*M"); 

    private String value; 

    private SpecialCharacter(String value) { 
     this.value = value; 
    } 

    public String toString() { 
     return this.value; // This will return , # or + 
    } 

    public static SpecialCharacter valueOfKey(String key) { 
     for (SpecialCharacter specialCharacter : values()) { 
      if (specialCharacter.toString().equals(key)) { 
       return specialCharacter; 
      } 
     } 
     throw new IllegalArgumentException("Illegal key"); 
    } 
} 

ConverterClass:

@Converter(autoApply = true) 
public class SpecialCharacterConverter implements AttributeConverter<SpecialCharacter, String> { 

    /** 
    * Converts a {@link SpecialCharacter} to the correspondig String that is used in the database 
    */ 
    @Override 
    public String convertToDatabaseColumn(SpecialCharacter specialCharacter) { 
     return specialCharacter.toString(); 
    } 

    /** 
    * Converts a String from the database to the corresponding {@link SpecialCharacter}. 
    */ 
    @Override 
    public SpecialCharacter convertToEntityAttribute(String dbValue) { 
     return SpecialCharacter.valueOfKey(dbValue); 
    } 

} 

Entity-объекта:

@Entity 
public class SomeEntity { 

    @Column(name = "Special_Char") 
    private SpecialCharacter specialCharacter; 

    public SpecialCharacter getSpecialCharacter() { 
     return this.specialCharacter; 
    } 

    public void setSpecialCharacter(SpecialCharacter specialCharacter) { 
     this.specialCharacter = specialCharacter; 
    } 
} 
+0

Я пробовал это, но он хранит стандартную ценность в моей базе данных –

+0

Используете ли вы реализацию JPA 2.1? Не забудьте «autoApply = true». – Christopher

+0

Да Я использую JPA 2.1 –

Смежные вопросы