繁体   English   中英

如何映射列表<String>使用 Hibernate/JPA 而没有额外的连接表?

[英]How to map a List<String> with Hibernate/JPA WITHOUT an extra join table?

我问的问题很简单,但似乎不可能找到答案。 我正在使用 Spring Data JPA 并且我有一个 JDBC/JPA DataSource (它是 PostgreSQL,但这无关紧要),它预先加载了数据,我只是想从中读取数据。

如何构建我的 POJO 以便我可以拥有一个不需要额外连接表的List<String>字段? 这是我拥有的一个示例实体类:

@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
  @Id
  @Column(name = "id", columnDefinition = "uuid")
  private String id;

  @Column(name = "a_string", columnDefinition = "text")
  private String aString;

  @Column(name = "strings", columnDefinition = "text[]")
  @ElementCollection
  private List<String> strings;

  // getters/setters
}

这样做我得到一个org.postgresql.util.PSQLException: ERROR: relation "pojo_strings" does not exist

为什么 hibernate 认为我想要的String在另一个表中? 如何解决此行为? 我只是想通过 JPA 将 PostgreSQL text[]列映射回 POJO 中的List<String>

在这些情况下的方法是像这样使用 jpa 的AttributeConverter

@Converter
public class StringToListConverter implements AttributeConverter<List<String>, String> {

  @Override
  public String convertToDatabaseColumn(List<String> list) {
    if(list == null) return "";
    return String.join(",", list); 
  }

  @Override
  public List<String> convertToEntityAttribute(String joined) {
    if(joined == null) return new ArrayList<>();
    return new ArrayList<>(Arrays.asList(joined.split(",")));
  }
}

并在您的实体字段中使用注释Converter

@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
  @Id
  @Column(name = "id", columnDefinition = "uuid")
  private String id;

  @Column(name = "a_string", columnDefinition = "text")
  private String aString;

  @Column(name = "strings")
  @Convert(converter = StringToListConverter.class)
  private List<String> strings;

  // getters/setters
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM