在冬眠中将枚举映射到字符串


92

我有一个类别休眠模型:

@Entity
@Table(name = "category")
public class Category {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @Column(name = "type")
    private String type;

其中有一个类型字符串字段。另外,我还有一个Java枚举,它表示类别的类型:

public enum CategoryType {
    INCOME, OUTCOME;
}

我想用它代替字符串类型。SQL在varchar参数中接受两个不同的值:CategoryIncomeCategoryOutcome。我希望Category模型类接受一个枚举变量-并在休眠状态下以某种方式将其映射到字符串。

可能吗?

Answers:


182

是的,有可能。它应该是:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;

15
您甚至可以走得更远,现在,随着JPA 2.1的发布,使用@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
–membersound

6
对于可能遇到相同问题的任何人..:我必须将此注释放在getter方法而不是字段中,例如:@Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }
ZeroOne

我处于hibernate.ddl-auto=update模式下,必须将表放下,让hibernate再次创建它,以便将枚举从int转换为varchar。希望它可以帮助遇到类似问题的人。
Arashsoft '18

如果枚举值被枚举,尽管枚举值被写为序数,请参见stackoverflow.com/questions/44864675/…
metamaker '18

我不会把它放在吸气剂上。将其放在变量声明上可以很好地工作,这对于使用@Data等的Lombok很有好处。如果我想将此应用到所有枚举而不注释每个枚举,该怎么办?
安德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.