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

Mr_*_*s_D 3 java enums ejb entitymanager ejb-3.0

(MySQL) 数据库中的评级列具有类型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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

导致Data truncated for column 'rating' at row 1NC_17("NC-17") 异常(和 PG_13("PG-13"),适用于其他值) - 没关系,异常应该读取Data rejected for enum ENUM('G','PG','PG-13','R','NC-17') for column 'rating' at row 1.

发生这种情况是因为它尝试插入字符串 NC_17 - 我认为按toString()上面的方式添加可以解决此问题,但显然调用rating.name()生成要插入的字符串(而不是 rating.toString())。

是否有任何解决方法,或者我是否必须将评级类型更改为ENUM('G','PG','PG_13','R','NC_17')数据库中的评级类型?

编辑:从评论中 - 我问的是为什么 JPA 在更新时不为 @Enumerated(EnumType.STRING) 实体字段调用 toString() ?所以我不能在数据库中放入任意字符?这对我来说似乎是一个疏忽,但显然事实并非如此——mysql 关闭了

JB *_*zet 5

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

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

如果这确实不是一个选项,并且您正在使用 Hibernate,那么您可以定义自己的 type,Hibernate 将使用该类型将枚举转换为字符串,反之亦然。