使用可能不存在的属性映射对象

时间:2017-02-27 00:27:53

标签: java hibernate

假设我有两个名为TextList和Article的类。

public class Article() {
    public int a_id;
    public TextList text;
}

public class TextList(){
    private String text1;
    private String text2;
    private String text3;
    private String text4;
}

像这样的表TEXT_ID:

text_id     text_type   text_content    article_Id
  1         text1       "Oh no"         1
  2         text3       "He has a dog"  1
  3         text4       "A Labrador"    1

正如您所看到的,对于 article_Id 1,我有三个文本(text1,text3,text4)。本文没有文本类型2,这不是问题。问题是,如何正确地在类 TextList 中映射字符串,这意味着检查 text_type 列并映射到它所属的属性?另外,我如何映射表中可能存在或不存在的属性?

1 个答案:

答案 0 :(得分:1)

根据您已经显示的表格布局,您可以按照以下方式对其进行建模,这基本上可以模仿您所描述的表格。

@Entity
public class TextEntity {
  @Id
  @Column(name = "text_id")
  private Long id;

  @Enumerated
  @Column(name = "text_type")
  private TextType textType;

  @Column(name = "text_content")
  private string text;

  @ManyToOne
  @JoinColumn(name = "article_id", referencedColumnName = "article_id")
  private Article article;
}

public enum TextType {
  TEXT1,
  TEXT2,
  TEXT3,
  TEXT4
}

但是,如果表格架构未被锁定且您可以使用略有不同的替代方案,我可能会建议您使用标识@ElementCollection的{​​{1}}来完成同样的事情。

Map<>

这避免了必须定义文本表实体,Hibernate将自动生成表格,如下所示:

@Entity
public class Article {
  @Id
  @Column(name = "article_id")
  private Long id;

  @ElementCollection
  private Map<String, String> textMap;
}

+-------------+----------------+------------+ | textMap_key | textMap_value | article_id | +-------------+----------------+------------+ | text1 | "Oh no" | 1 | | text3 | "He has a dog" | 1 | | text4 | "A labrador" | 1 | +-------------+----------------+------------+ 键是文本类型,而值是实际文本内容。 Hibernate会自动为你维护article_id关系。