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”)之类的东西呢?