我的模特课(作品):
public class User ... {
@Enumerated(STRING)
private Status status;
...
public enum Status {
ACTIVE,
INACTIVE;
@Override
public String toString() {
return this.name().toLowerCase();
}
}
...
public String getStatus() {
return status.name().toLowerCase();
}
public void setStatus(Status status) {
this.status = status;
}
}
如上所述,我重写了toString方法,但没有效果。
枚举在数据库中存储为ACTIVE
或INACTIVE
。
P.S。我使用hibernate jpa
感谢您的帮助!
P.S.S。我问,因为我写了生成json的REST服务(在json对象中更好地使用小写,如果我没有错的话)
答案 0 :(得分:9)
编写一个converter
类,注释为@Converter
,实现javax.persistence.AttributeConverter<YourEnum, String>
。有两种方法:
public String convertToDatabaseColumn(YourEnum attribute){..}
public YourEnum convertToEntityAttribute(String dbData) {..}
你可以应用大/小写逻辑。
稍后您可以使用给定的转换器注释您的字段。
答案 1 :(得分:2)
这是使用AttributeConverter
(在JPA 2.1中引入)
更新您的枚举类:
public enum Status {
ACTIVE,
INACTIVE;
public String toDbValue() {
return this.name().toLowerCase();
}
public static Status from(String status) {
// Note: error if null, error if not "ACTIVE" nor "INACTIVE"
return Status.valueOf(status.toUpperCase());
}
}
创建属性转换器:
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {
@Override
public String convertToDatabaseColumn(Status status) {
return status.toDbValue();
}
@Override
public Status convertToEntityAttribute(String dbData) {
return Status.from(dbData);
}
}
如果autoApply
设置为true,则无需将javax.persistence.Convert
注释添加到所有应转换的属性中。否则,请应用转换器:
import javax.persistence.Convert;
import javax.persistence.Entity;
@Entity
public class User {
@Convert(converter = StatusConverter.class)
@Enumerated(STRING)
private Status status;
// ... other fields, constructor(s), standard accessors
}
答案 2 :(得分:1)
如果您将Jackson用于REST服务,请让Jackson在REST边界进行转换。您的问题没有说明数据库存储小写字母或应用程序处理小写字母的要求。
public enum Status {
STARTED,
CONSUMING,
GENERATING,
FAILED,
COMPLETED,
DELETED;
/**
* Serialises to and from lower case for jackson.
*
* @return lower case Status name.
*/
@JsonValue
public String toLower() {
return this.toString().toLowerCase(Locale.ENGLISH);
}
}
答案 3 :(得分:0)
最佳做法是使用大写枚举常量。
我看到两个选项
答案 4 :(得分:0)
您可以将User类中的字段定义为String。当您将实体保存到存储库时,请使用enum类来验证值:
User user = new User(Status.valueOf(status.toUpperCase()).toString().toLowerCase())