2016-04-26 101 views
0

我想知道两个表之间是否可以有一对多的jpa 2.x关系。我期待这样的事情: (我搜索了很多与谷歌,找出没有成功类似的情景)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; 
.... 

请注意,我用了“龙iRelatedColors”,而不是“长iRelatedColors”因为iRelatedColors属性可以为空

颜色实体

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

我不会l IKE有型客户的属性在颜色实体

我需要的是:

  • 当读取一个客户,那么列表的iColor必须当调用相应get填充...方法

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

而且我所有我需要的只有:

  • Customer表

    的RELATEDCOLORS列使用一个唯一的编号填写(例如:10,20,30,40 ECC)

  • 在Customer表中,RELATEDCOLORS列必须始终不为空,如果Colors表中存在相应的ID,则该列不会为空。 如果其中一个CUSTOMER行在RELATEDCOLORS列中有一个空值,那么在运行期间会有一个由Hibernate抛出的NullPointerException异常。

使用我显示给你的数据不起作用,我不明白为什么。

在此先感谢您的帮助。

+0

你一对多的映射将明显增加FK到颜色,所以如果你不这样做像它然后删除该映射,并把OneToOne/ManyToOne和FK将在客户。 –

+0

客户>颜色的关系显然是@ManyToOne,所以我不确定你为什么要将它映射为@OneToMany? –

+0

大家好,谢谢你的回答。尼尔,请问你能更具体些吗? Alan,从表格数据中可以看出,客户>颜色之间的关系是OneToMany。例如Jhon的颜色为红色,绿色和蓝色 谢谢 – gpezzini

回答

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 -table实际上几乎看起来像连接表,但不是。 此外,你的OneToMany-Relation是一个额外的连接表。

只是你的颜色映射为单向一对多如下,颜色摆脱在客户RELEATEDCOLORSFATHERID

@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;