JPA 2.x单向一对多关系

时间:2016-04-26 16:22:15

标签: hibernate jpa

我想知道两个表之间是否有一对多的jpa 2.x关系。我正在寻找这样的东西: (我用谷歌搜索了很多相似的场景但没有成功)

CUSTOMER
ID   NAME    RELATEDCOLORS
1    John    10
2    Albert  20
3    Maria   10
4    Smith   null

COLORS
ID   FATHERID   COLOR
1    10         Red
2    10         Green
3    10         Blu
4    20         Cyan

正如您所看到的,每个人都有相应的颜色。因此,约翰和玛丽亚的颜色都是红色,绿色和蓝色。对于阿尔伯特来说,颜色是青色,而对于史密斯则没有颜色。

我尝试过这样的事情:

客户实体

....
@Id
@Column(name = "ID", nullable = false)
private long iId;
@Column(name = "NAME")
private String iName;
@Column(name = "RELATEDCOLORS", nullable = true)
private Long iRelatedColors;
@JoinColumn(name = "FATHERID",referencedColumnName="RELATEDCOLORS", nullable=true)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Colors> iColors;
....

请注意,我使用了“Long iRelatedColors”而不是“long iRelatedColors”,因为iRelatedColors属性可以为null

颜色实体

....
@Id
@Column(name = "ID", nullable = false)
private long iId;
@Column(name = "FATHERID", nullable = false)
private long iFatherId;
@Column(name = "COLOR")
private String iColor;
....

我不喜欢在Colors实体

中有Customer类型的属性

我需要的是:

  • 当客户被阅读时,当我调用相应的get ...方法时,必须填充列表iColor

  • 在iColors列表中更改后更新客户时(例如:添加新颜色或删除颜色) 那么颜色实体也必须更新。

只有在以下情况下,我才能拥有所需的一切:

    客户表中的
  • 使用唯一编号(例如:10,20,30,40 ecc)填充RELATEDCOLORS列

  • 在Customer表中的
  • ,RELATEDCOLORS列必须始终不为null,如果Colors表中有相应的id,则不重要。 如果其中一个CUSTOMER行在RELATEDCOLORS列中具有空值,则在运行时期间会出现hibernate抛出的NullPointerException。

使用我向您展示的数据不起作用,我不明白为什么。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的模型包含太多的不一致性,实际上根本不常见。如果John获得颜色Green, Blue and Cyan,您会怎么做?这意味着,除非表RELATEDCOLORS获得更多此类数据,否则无法评估字段COLORS,因为Maria仍有Red, Green and Blue颜色:

COLORS
ID   FATHERID   COLOR
1    10         Red
2    10         Green
3    10         Blue
4    20         Cyan
5    30         Green
6    30         Blue
7    30         Cyan

这会导致大量冗余数据。您的Color - 表实际上几乎看起来像一个联接表,但不是。 除此之外,您的OneToMany-Relation是一个额外的连接表。

只需将您的颜色映射为单向OneToMany,然后删除Customer中的RELEATEDCOLORS和Color中的FATHERID

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinTable(name="CUSTOMER_COLORS", joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName="iId")}, inverseJoinColumns={@JoinColumn(name="COLOR_ID", referencedColumnName="iId")})
private List<Color> iColors;