如何在实体中正确创建关系

2022-02-22 00:00:00 java spring-data-jpa

描述计算机的实体

@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

相关文章