Sprind Data JPA OneToOne和ManyToOne Relations

时间:2016-05-31 19:17:41

标签: hibernate jpa spring-data-jpa entity-relationship

我有2个名为MachineMachineType的实体。 Machine只能有一个MachineType,但MachineType可以有多个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
}

MachineType

@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正确而且我现在卡住了。我什么时候应该使用它们?

2 个答案:

答案 0 :(得分:1)

  

我没有正确理解mappedBy和@JoinColumn而且我现在卡住了。

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

@JoinColumn =数据库中外键列的名称。这意味着在您定义表时,例如MACHINEMACHINE_TYPE,您可以将MACHINE_TYPE表的主键添加到MACHINE中,从而在表。此字段称为外键,因为它指向数据库中另一个表中的另一个记录。此列的名称通过此批注指定。

注意:仅当您需要双向关系时才需要 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
 }

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

答案 1 :(得分:0)

在Machine中,您应该使用ManyToOne关系。如果要进行双向关联,可以在MachineType中添加OneToMany。 MappedBy vs JoinColumn的回答是 JPA JoinColumn vs mappedBy