实体管理器@Enumerated(EnumType.STRING) - 如何使用toString()?

时间:2014-02-13 15:59:11

标签: java enums ejb ejb-3.0 entitymanager

(MySQL)数据库中的rating列具有类型ENUM('G','PG','PG-13','R','NC-17')(注意破折号)。这样:

@Entity
@Table(name = "movies")
public class Movie implements Serializable {

    @Enumerated(EnumType.STRING)
    private Rating rating;

    public static enum Rating {
        G("G"), NC_17("NC-17"), R("R"), PG("PG"), PG_13(
                "PG-13");

        private String label;

        private Rating(String label) {
            this.label = label;
        }

        public String getLabel() {
            return label;
        }

        @Override
        public String toString() { // added but still
            return label;
        }
    }
}

导致NC_17(“NC-17”)(和PG_13(“PG-13”)的Data truncated for column 'rating' at row 1异常,适用于其他值) - 请务必阅读Data rejected for enum ENUM('G','PG','PG-13','R','NC-17') for column 'rating' at row 1。< / p>

这是因为它试图插入字符串NC_17 - 我认为如上所述添加toString()会解决此问题,但显然会调用rating.name()来生成要插入的字符串(而不是rating.toString() )。

是否有任何变通办法或是否必须在数据库中将评分类型更改为ENUM('G','PG','PG_13','R','NC_17')

编辑:从评论中 - 我问的是为什么JPA在更新时没有为@Enumerated(EnumType.STRING)实体字段调用toString()?所以我不能把db任意的字符放入?这似乎是对我的疏忽,但显然它不是 - 所以关闭mysql

1 个答案:

答案 0 :(得分:2)

JPA使用枚举的name(),而不是toString()返回的内容,它可以被覆盖并在每次调用时返回不同的内容。 name()没有遇到此问题,因为它是最终的,因此保证始终返回相同的内容。

因此,最简单的选择是重命名数据库中的值,使其与枚举名称匹配。

如果这不是一个选项并且您正在使用Hibernate,那么您可以define your own type,它将用于通过Hibernate将枚举转换为String,反之亦然。< / p>