Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee JPA@OneToMany困境_Jakarta Ee_Jpa_One To Many - Fatal编程技术网

Jakarta ee JPA@OneToMany困境

Jakarta ee JPA@OneToMany困境,jakarta-ee,jpa,one-to-many,Jakarta Ee,Jpa,One To Many,我有三种关系导致了我的问题 <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 St

我有三种关系导致了我的问题

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

@实体
@表(name=“area”)
公共类区域实现可序列化
{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(name=“name”)
私有字符串名称;
...................   
}
@实体
@表(name=“law\u连接”)
公共类连接实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})
@JoinColumn(name=“客户”)
私人客户;
@OneToMany(fetch=FetchType.LAZY,targetEntity=Area.class,cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})
@JoinColumn(name=“areas”)
私人名单领域;
……………………    
}
@实体
@表(name=“worker”)
公共类工作程序实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(name=“firstName”)
私有字符串名;
@列(name=“lastName”)
私有字符串lastName;
@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})
@JoinColumn(name=“组织”)
私人机构;
@列(name=“status”)
@枚举(EnumType.ORDINAL)
私营工人国家;
@OneToMany(fetch=FetchType.LAZY,targetEntity=Area.class,cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})
@JoinColumn(name=“areas”)
私人名单领域;
………………..    
}
数据库中发生的情况如下:

<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

mysql>从区域中选择*;
+------+-----------------------+------------+
|ID |名称|区域|
+------+-----------------------+------------+
|1601 |未知|空|
|1602 |某地|空|
|1603 |其他地方|空|
|1604 |某地2 |空|
|1605 |某地3 |空|
|1606 |某地4 |空|
|1607 |某地5 |空|
|1608 |某地6 |空|
|1609 |某地7 |空|
|1610 |某地7 | 1652|
|1611 |某地8 |空|
+------+-----------------------+------------+
一组11行(0.00秒)

不能在两个单独的集合之间共享外部外键。您当前在区域中有“区域”列,表示该区域是否在Connection.areas中,也表示该区域是否在Worker.areas中。如果它在该列中有值,它如何知道它与哪个集合相关?(当它试图检索Worker.areas时,它将只查找将“areas”列设置为特定Worker“id”的所有区域行,…对于Connection.areas也是如此)


更好的选择是在区域中有单独的FK列,例如一个称为WORKER\u ID,另一个称为CONNECTION\u ID。这样,一个区域可以位于Worker.areas中,也可以位于Connection.areas中。区域和关系是分开处理的。

您忽略了如何持久化这些对象。那么,在持久化之前,您只向“区域”集合添加了一个区域?根据以上信息谁知道呢。另外,您正在为两个不同的目的重用Area表中的“areas”列,这很容易出现故障。。。它如何知道该区域是工人区域还是连接“区域”??谢谢Neil,如果你不介意你的第二条评论,请进一步解释,因为听起来这就是问题所在。那么,我是否需要在worker实体中使用@JoinColumn(name=“workers”)和在连接实体中使用@JoinColumn(name=“connections”)之类的东西呢?