簡體   English   中英

mysql將datatype列設置為java set mapping

[英]mysql set datatype column to java set mapping

我在使用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 select查詢返回類型。 那么sql中的Set數據類型如何工作以及映射它的正確注釋是什么?

更新:我也試過了

 @TypeDefs({@TypeDef(name = "javaSet", typeClass = HashSet.class)})

並用。注釋getter

@Type(type = "javaSet")

但是在反序列化期間,這不適用於EOFException。 這可能通過使用正確的類型替換HashSet來反序列化為。

我知道這是一個老問題,但我更喜歡在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的不可變版本,因為這樣可以避免嘗試更改設置值而不實際更改數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM