Sprind Data JPA OneToOne 和 ManyToOne 关系

Sprind Data JPA OneToOne and ManyToOne Relations

我有 2 个名为 MachineMachineType 的实体。 Machine 只能有一个 MachineTypeMachineType 可以有多个或 none Machine。我尝试了大量的关系注释,但我错过了一些东西。

机器

@Entity
public class Machine {

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "machine_id")
private Long machineId;

@OneToOne(???)
private MachineType machineType;

@Column(name = "machine_name")
private String MachineName;

//getters and setters
}

机器类型

@Entity
public class MachineType {

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long machineTypeId;

@ManyToOne(???)
private List<Machine> machines;

@Column(name = "machine_type_name")
private String machineTypeName;

//getters and setters
}

我没有正确理解 mappedBy@JoinColumn,我现在卡住了。我应该什么时候使用它们?

在Machine中,应该使用ManyToOne关系。如果你想要双向关联,你可以在 MachineType 中添加 OneToMany。 MappedBy vs JoinColumn 在 JPA JoinColumn vs mappedBy

I dont understand mappedBy and @JoinColumn correctly and I stuck right now.

mappedBy = 关系字段或作为关系所有者的实体的 属性。在此示例中,这是由 @ManyToOne 注释注释的 machineType 字段。

@JoinColumn = 数据库中外键列的名称。这意味着当您定义 table 时,例如 MACHINEMACHINE_TYPE,您将 MACHINE_TYPE table 的主键添加到 MACHINE 从而在 table 之间建立关系。该字段称为外键,因为它指向数据库中另一个 table 中的另一条记录。此列的名称是通过此注释指定的。

注意:只有在需要双向关系时才需要 mappedBy 元素。否则不需要。

@Entity
public class Machine {

    @Id
    @GeneratedValue
    @Column(name = "machine_id")
    private Long machineId;

    @ManyToOne
    @JoinColumn(name="name_of_foreignkey")
    private MachineType machineType;

    @Column(name = "machine_name")
    private String MachineName;

   //getters and setters
}

@Entity
public class MachineType {

    @Id
    @GeneratedValue
    private Long machineTypeId;

    @OneToMany(mappedBy="machineType")
    private List<Machine> machines;

    @Column(name = "machine_type_name")
    private String machineTypeName;

    //getters and setters
 }

我从 GeneratedValue 注释中删除了 strategy = GenerationType.TABLE,因为它不会像您指定的那样工作。如果您想使用 table 生成器(这是生成主键的推荐方法),您必须做的不仅仅是像您那样指定。