代码之家  ›  专栏  ›  技术社区  ›  HeDinges

Hibernate可以用空白映射枚举类型吗?

  •  4
  • HeDinges  · 技术社区  · 15 年前

    在对旧数据库进行Hibernate映射时,我希望使用Enumtypes将包含带空白字符串常量的某些列映射到某个枚举类。

    映射:

    @Entity
    @Table(name = "OPERATOR")
    public class Operator {   
        @Id
        @Column(name = "ID")
        private Long id;
        ...
    
        @Enumerated(EnumType.STRING)
        @Column(name = "STATUS")
        private Status status;
        ...
    }
    
    public enum Status {
        OPERATOR_CREATED("Operator created"),
        ACTIVE("Active"),
        END_DATED("End dated");
    
        private String name;
    
        Status(String status) {
           name = status;
        }
    }
    

    正如您所看到的,我们不能将数据库值直接作为枚举名,因为其中有空格。

    我想知道是否可以用Enums来做这个?

    2 回复  |  直到 6 年前
        1
  •  4
  •   mtpettyp    12 年前

    GenericEnumUserType 描述在 hibernate.org (在“灵活解决方案”下)

    修改 Status 如下:

    public enum Status 
    {
        OPERATOR_CREATED("Operator created"),
        ACTIVE("Active"),
        END_DATED("End dated");
    
        private String name;
    
        Status(String status) 
        {
           name = status;
        }
    
        public String toString()
        {
           return name;
        }
    
        public Status fromString( String value )
        {
            if ( "Operator created".equals( value ) 
            {
                return OPERATOR_CREATED;
            }
            //etc
        }
    }
    

    现在使用 @Type 实体上的批注。

    @Entity
    @Table(name = "OPERATOR")
    public class Operator {   
        @Id
        @Column(name = "ID")
        private Long id;
        ...
    
        @Column(name = "STATUS", columnDefinition = "VARCHAR(31)", nullable = false )
        @Type( type = "my.package.GenericEnumUserType",
               parameters = {
            @Parameter( name = "enumClass", value =  "my.package.Status" ),
            @Parameter( name = "identifierMethod", value = "toString" ),
            @Parameter( name = "valueOfMethod", value = "fromString" ) } )
        private Status status;
        ...
    }
    
        2
  •  0
  •   Anton Kim    6 年前

    我也有同样的情况,试着用 replace 函数,类似于:

    @ColumnTransformer(read = "replace(status::varchar, ' ', '')", write = "replace(?, 'End', 'End ')::status")
    

    您有下划线,所以需要稍微修改一下。

    regexp_replace 如果有几个带有空格的枚举值,也很方便。

    注意,我使用的是PostgreSQL 9.6