【发布时间】:2023-03-17 23:44:01
【问题描述】:
我在使用 JPA 将 mysql SET 类型映射到 Java Set 时遇到问题 为了说明我的问题,我在下面构建了一个随机示例
这是一个表,其列类型为 Set(即:它将是字符串的集合)
CREATE TABLE `MusicCD` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`period` ENUM('Classical', 'Modern','Antique') NOT NULL,
`genre` SET('horror','thriller','comedy','drama','romance') ,
PRIMARY KEY (`id`)
)
下面是用于映射的实体类
@Entity
@Table(name = "MusicCD")
class MusicCD {
private long id;
private Period period;
private Set<String> genre;
//other getter setters //
@Column(name = "genre")
@ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
public Set<String> getGenre() {
return genre;
}
public void setGenre(Set<String> genre) {
this.genre = genre;
}
}
使用此映射也不例外,但实体对象中的集合为空,因为 JPA/hibernate 发送的 get 查询发送了对 MusicCD 表中所有字段的查询,但对于流派,它向表 MusicCD_genre 发送单独的查询
当我看到 sql 模式时,有一个自动生成的表 MusicCD_genre 是空的。 为 MusicCD 上的流派发送 sql 选择查询会返回流派。 那么 sql 中的 Set 数据类型是如何工作的以及映射它的正确注解是什么?
更新: 我也试过了
@TypeDefs({@TypeDef(name = "javaSet", typeClass = HashSet.class)})
并用
注释getter@Type(type = "javaSet")
但这在反序列化期间不适用于 EOFException。 这可以通过将 HashSet 替换为要反序列化的正确类型来实现。
【问题讨论】:
-
JPA ElementCollection 需要一个“连接”表来存储元素。它不支持任何“MySQL-specific”列类型
-
hibernate 也支持自定义类型。应该可以使用它进行反序列化,如更新后的帖子(?)