(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
答案 0 :(得分:2)
JPA使用枚举的name()
,而不是toString()
返回的内容,它可以被覆盖并在每次调用时返回不同的内容。 name()
没有遇到此问题,因为它是最终的,因此保证始终返回相同的内容。
因此,最简单的选择是重命名数据库中的值,使其与枚举名称匹配。
如果这不是一个选项并且您正在使用Hibernate,那么您可以define your own type,它将用于通过Hibernate将枚举转换为String,反之亦然。< / p>