如何在实体中正确创建关系
描述计算机的实体
@Entity
@Table(name = "machine")
public class Machine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "machine_node", joinColumns = @JoinColumn(name = "machine_id"), inverseJoinColumns = @JoinColumn(name = "node_id"))
private List<NodeMachine> nodeMachines = new ArrayList<>();
}
描述部件/节点的实体
@Entity
@Table(name = "node_machine")
public class NodeMachine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
每台计算机上都安装了几个部件(nodeMachines列表),每个部件可以安装在不同的计算机上,于是添加了ManyToMany。
例如,轮子可以安装在摩托车或汽车上。一辆摩托车可以有两个轮子,一辆汽车可以有四个轮子。
我将更详细地描述表格中的内容。我必须直截了当地说,这个例子不是很成功,只是为了理解。在机器表中,我们有100辆M摩托车(1-100辆)和100辆C车(1-100辆)。而且NodeMachine表中只有一个条目-K1车轮,它适用于所有100辆摩托车和所有100辆汽车。由此,无法确定每辆摩托车和每辆汽车应该有多少个轮子。因此,我相信应该有第三个表,列明每辆汽车和每辆电单车的轮数。我认为在表中保留200条摩托车车轮记录和400条汽车记录太多余了。
每个部件都安装在特定数量的特定计算机上。 我想通过知道节点和机器名称来获取安装在特定机器上的节点数。 为此,您必须使用字段创建另一个COUNT_MACHINE_NODE表- machine_id
- node_id
- count
我知道您必须创建一个新实体。
@Entity
@Table(name = "node_machine")
public class CountNodeMachine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long machine_id;
private Long node_id;
private Integer count;
}
但是您需要在这些实体中注册哪些连接?
如何正确链接这三个表?
我是否需要创建CountNodeMachine实体?
解决方案
如果此操作有用,请评论。
计算机实体:
@Entity
@Table(name = "machine")
public class Machine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy="machineId")
List<MachinePartCount> count;
部件实体
@Entity
@Table(name = "part")
public class Part {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy="partId")
List<MachinePartCount> count;
关系实体
@Entity
@Table(name="machine_part")
@IdClass(MachinePartCountPK.class)
public class MachinePartCount {
@Id
private Integer machineId;
@Id
private Integer partId;
private Integer count;
复合键
@Embeddable
public class MachinePartCountPK implements Serializable{
private static final long serialVersionUID = 1L;
private Integer machineId;
private Integer partId;
输出:
**machineService.findAll()**
getAllMachines: [Machine [id=1, name=m1, count=[MachinePartCount [machineId=1, partId=1, count=2]]], Machine [id=2, name=m2, count=[MachinePartCount [machineId=2, partId=102, count=4]]]]
**partService.findAll()**
getAllParts: [Part [id=1, name=p100, count=[MachinePartCount [machineId=1, partId=1, count=2]]], Part [id=102, name=p10, count=[MachinePartCount [machineId=2, partId=102, count=4]]]]
**machinePartCountService.findAll()**
getmachinePartEntries: [MachinePartCount [machineId=1, partId=1, count=2], MachinePartCount [machineId=2, partId=102, count=4]]
表中的数据:
机器工作台:
machine
零件表:
part
MACHINE_PART表:
machine_part
相关文章