【问题标题】:How to set enum field as Integer via Hibernate to db?如何通过 Hibernate 将枚举字段设置为 Integer 到 db?
【发布时间】:2015-07-23 12:47:34
【问题描述】:

我的数据库中有整数列作为“状态”。

我的枚举类:

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:错误:列“状态”是 integer 类型,但表达式是 bytea 类型。 提示:您需要重写或转换 expression.bytea

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

【问题讨论】:

  • 你在使用 org.hibernate.dialect.PostgreSQLDialect 吗?
  • 我用它:hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
  • 如果您可以控制数据库(客户端不需要部署在 MySQL 上),那么您可以对枚举使用字符串表示,并为列使用 Postgres 枚举类型,一切都会Just Work,具有数据库原生枚举的优势。
  • @Gyhot 你试过了吗?

标签: java hibernate postgresql enums


【解决方案1】:

我建议你使用转换器。

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

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

您可以将字段定义为:

@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 描述了我为您的示例实施的解决方案。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多