2014-12-06 138 views
0

我有三個關係導致我的問題。JPA @OneToMany困境

<code> 
@Entity 
@Table(name="area") 
public class Area implements Serializable 
{ 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name="name") 
private String name; 
................... 

} 

@Entity 
@Table(name="law_connection") 
public class Connection implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 


@OneToOne(fetch=FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) 
@JoinColumn(name="client") 
private Client client; 

@OneToMany(fetch=FetchType.LAZY,targetEntity=Area.class, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) 
@JoinColumn(name="areas") 
private List<Area> areas; 

……………………  
} 



@Entity 
@Table(name=「worker」) 

public class Worker implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 


@Column(name="firstName")   
private String firstName; 

@Column(name="lastName") 
private String lastName; 

@OneToOne(fetch=FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) 
@JoinColumn(name="organisation") 
private Organisation organisation;  


@Column(name="status") 
@Enumerated(EnumType.ORDINAL) 
private WorkerState state; 

@OneToMany(fetch=FetchType.LAZY,targetEntity=Area.class,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) 
@JoinColumn(name="areas") 
private List<Area> areas; 

………………..  
} 

</code> 

在數據庫中會發生什麼情況是這樣的:

<code> 
mysql> select * from area; 
+------+-----------------------+------------+ 
| ID | name     | areas | 
+------+-----------------------+------------+ 
| 1601 | Unknown    |  NULL | 
| 1602 | Someplace     |  NULL | 
| 1603 | Someotherplace     |  NULL | 
| 1604 | Someplace2  |  NULL | 
| 1605 | Someplace3   |  NULL | 
| 1606 | Someplace4    |  NULL | 
| 1607 | Someplace5 |  NULL | 
| 1608 | Someplace6    |  NULL | 
| 1609 | Someplace7   |  NULL | 
| 1610 | Someplace7   |  1652 | 
| 1611 | Someplace8    |  NULL | 
+------+-----------------------+------------+ 
11 rows in set (0.00 sec) 
</code 

什麼觀察的是,只能有一個對象指向一個區域,我有什麼誤解嗎?

我需要一個工人有許多領域,並連接到至少有一個我在做什麼錯

+0

你不想說如何堅持這些對象。所以你只在一個區域添加一個區域到「區域」集合纔可能持續?誰知道基於上面的信息。此外,您正在重複使用區域表中的「區域」列以用於兩個單獨的目的,這很容易出現故障......它如何知道區域是工人還是連接「區域」? – 2014-12-06 11:05:47

+0

謝謝尼爾,請進一步解釋,如果你不介意你的第二個評論,因爲它聽起來像是問題所在。那麼我是否需要在連接實體中的工作者實體中使用@JoinColumn(name =「workers」)和@JoinColumn(name =「connections」)? – 2014-12-06 11:21:12

回答

0

您不能共享兩個單獨集合之間的外部外鍵。您目前在Area中有「區域」列,表示該區域是否在Connection.areas中,並且還表示該區域是否在Worker.areas中。如果它在該列中有價值,它將如何知道它與哪個集合有關? (當它試圖檢索Worker.areas時,它將簡單地查找所有具有設置爲特定的Worker「id」的「區域」列的Area行......對於Connection.areas也是如此)。

更好的選擇是在Area中有單獨的FK列,一個名爲WORKER_ID,另一個名爲CONNECTION_ID。這樣一個區域可以在Worker.areas中,也可以在Connection.areas中,並且關係是分開處理的。