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 关闭了
JPA 使用name()枚举的 ,而不是返回的内容toString(),它可以被覆盖并在每次调用时返回不同的内容。name()没有这个问题,因为它是最终的,因此保证总是返回相同的东西。
因此,最简单的选择是重命名数据库中的值,以便它们与枚举名称匹配。
如果这确实不是一个选项,并且您正在使用 Hibernate,那么您可以定义自己的 type,Hibernate 将使用该类型将枚举转换为字符串,反之亦然。
| 归档时间: |
|
| 查看次数: |
10840 次 |
| 最近记录: |