可以使用空格来休眠映射枚举类型吗?

时间:2009-05-26 10:15:25

标签: java hibernate jpa

对遗留数据库进行hibernate映射我想使用EnumTypes将包含空格的字符串常量的某些列映射到某些Enum类。

映射:

@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;
    }
}

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

我想知道是否可以使用枚举?

2 个答案:

答案 0 :(得分:4)

查看hibernate.org所述的GenericEnumUserType(在“灵活解决方案”下)

修改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;
    ...
}

答案 1 :(得分:0)

我的情况完全相同,请尝试使用replace函数,如下所示:

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

您有下划线,因此需要对其进行一些修改。

如果枚举值中包含多个空格,

regexp_replace也很方便。

注意,我正在使用PostgreSQL 9.6

相关问题