【问题标题】:mysql set datatype column to java set mappingmysql set datatype column to java set mapping
【发布时间】: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 也支持自定义类型。应该可以使用它进行反序列化,如更新后的帖子(?)

标签: java mysql hibernate jpa


【解决方案1】:

我知道这是一个老问题,但我更喜欢在 getter/setter 中处理这些“MySQL 特殊类型”列,因为它们最常用于 Java 代码。

@Entity
@Table(name = "MusicCD")
class MusicCD {
  /*...*/
  @Column(name = "genre")
  private String genreStr;
  /*...*/
  public Set<String> getGenre() {
    if(genreStr == null)
      return Collections.emptySet();
    else
      return Collections.unmodifiableSet(
        new HashSet<String>(Arrays.asList(genreStr.split(",")))
      );
  }

  public void setGenre(Set<String> genre) {
    if(genre == null)
      genreStr = null;
    else
      genreStr = String.join(",", genre);
  }
}

我使用 Set 的不可变版本,因为这样可以避免在不实际更改 DB 的情况下尝试更改设置值。

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2022-12-26
    相关资源
    最近更新 更多