2014-12-06 7 views
0

У меня есть три отношения, которые вызывают у меня проблемы.JPA @OneToMany woes

<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

Вы опускаете, чтобы сказать, КАК вы сохраняли эти объекты. Таким образом, вы только добавили один район в коллекцию «областей», прежде чем, возможно, сохранились? кто знает, основываясь на информации выше. Кроме того, вы повторно используете столбец «area» в таблице Area для двух отдельных целей, которые подвержены неудаче ... как он узнает, является ли Area рабочим или «областью» соединения? ???? –

+0

Спасибо Нейл, пожалуйста, объясните, если вы не возражаете против своего второго комментария, так как это звучит так, вот где проблема. Так что мне нужно использовать что-то вроде @JoinColumn (name = "workers") в рабочем объекте и @JoinColumn (name = "connections") в объекте соединения? –

ответ

0

Вы не можете поделиться внешним внешний ключом между двумя отдельными сборниками. У вас в настоящее время есть столбец «районы» в области, представляющий, находится ли область в Connection.areas, а также представляет ли область в рабочем месте. Если бы в этом столбце была ценность, как бы он знал, к какой коллекции он относится? (когда он пытается получить Worker.areas, он просто ищет все строки Area, которые имеют столбец «area», установленный для конкретного «id» рабочего «...» аналогично для Connection.areas).

Лучший вариант - иметь отдельные столбцы FK в области, один называется WORKER_ID, а другой называется CONNECTION_ID, например. Таким образом, область может находиться в Worker.areas, а также в Connection.areas и отношения обрабатываются отдельно.