gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:02:00 26 4
gpt4 key购买 nike

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

导致 NC_17("NC-17") 出现数据在第 1 行的“评级”列被截断异常(和 PG_13("PG-13"),适用于其他值) -没关系,异常应该读取Data returned for enum ENUM('G','PG','PG-13','R','NC-17') for columns ' 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,那么您可以 define your own type ,Hibernate 将使用它将枚举转换为字符串,反之亦然。

关于java - 实体管理器 @Enumerated(EnumType.STRING) - 如何让它使用 toString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21759197/

26 4 0