2014-12-06 142 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中,并且关系是分开处理的。