如何通过Hibernate将枚举字段设置为整数到db?

时间:2015-05-12 14:48:38

标签: java hibernate postgresql enums

我有整数列作为" status"在我的数据库中。

我的枚举课程:

public enum MemberStatus {
   PASSIVE(0),ACTIVE(1);

   private int value;

   private MemberStatus(int value) {
      this.value = value;
   }

   public int getValue() {
      return value;
   }

}

我的实体字段:

@Column(name = "status", nullable = false)
@Enumerated(EnumType.ORDINAL)
private MemberStatus status;

休眠日志:

  

org.postgresql.util.PSQLException:错误:列"状态"类型为整数,但表达式的类型为 bytea 。   提示:您需要重写或强制转换 expression.bytea

我使用PostgreSQL。如何解决这个问题呢?有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我建议您使用转换器。

这是我遇到的最干净的解决方案,因为:

  • 您不再对添加值的顺序有疑问 枚举或重构枚举元素名称
  • 您可以更灵活地使用列的数据库类型

您可以将字段定义为:

@Column(name = "status", nullable = false)
@Convert(converter = MemberStatusEnumConverter.class)
private MemberStatus status;

枚举变得更简单:

public enum MemberStatus {
   PASSIVE,
   ACTIVE;
}

你的转换器类MemberStatusEnumConverter:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class MemberStatusEnumConverter implements    
AttributeConverter<MemberStatus,Integer>{
    @Override
    public Integer convertToDatabaseColumn(MemberStatus attribute) {
        switch (attribute) {
            case PASSIVE:
                return new Integer(0);
            case COUNTYLEVEL:
                return new Integer(1);
            default:
                throw new IllegalArgumentException("Unknown" + attribute);
        }
    }

    @Override
    public MemberStatus convertToEntityAttribute(Integer dbData) {
        if (dbData == 0){
            return MemberStatus.PASSIVE;
        } else if (dbData == 1){
            return MemberStatus.ACTIVE;
        }
        else{
            throw new IllegalArgumentException("Unknown" + dbData);
        }
    }
}

This article描述了我为您的示例实施的解决方案。