我想知道两个表之间是否有一对多的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列
,RELATEDCOLORS列必须始终不为null,如果Colors表中有相应的id,则不重要。 如果其中一个CUSTOMER行在RELATEDCOLORS列中具有空值,则在运行时期间会出现hibernate抛出的NullPointerException。
使用我向您展示的数据不起作用,我不明白为什么。
提前感谢您的帮助。
答案 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;