2个表的序列中具有相同的ID-JPA

时间:2018-10-15 19:11:32

标签: java spring hibernate jpa sequence-generators

我有2个实体使用与主键相同的序列,该如何映射? 示例:

@Entity
@Table("employeT")
    public class Employe(){
          @SequenceGenerator(name = "generator_id", sequenceName = "seq_id") 
          @GeneratedValue(generator = "generator_id")
          @colunm(name = "id")
          private Integer id;

          @colunm(name = "nameEmp")
          private String name;

          @JoinColumn(name = "id")
          private Computer computer;
}

@Entity
@Table("computerT")
    public class Computer(){
          @SequenceGenerator(name = "generator_id", sequenceName = "seq_id") 
          @GeneratedValue(generator = "generator_id")
          @colunm(name = "id")
          private Integer id;

          @colunm(name="name_computer")
          private String nameComputer;
}

我需要由Employe save生成的具有相同ID的保存员工和计算机。

1 个答案:

答案 0 :(得分:1)

要使代码按照您想要的方式工作,需要做三件事。

  1. 添加 @OneToOne 批注以表明Employee和Computer之间存在联系。
  2. 从您的计算机实体中删除有关 @SequenceGenerator 的信息,并添加 @Id 注释
  3. 添加 @MapsId 批注。 [More info]

所以它看起来像这样:

@Entity
@Table("employeT")
public class Employe(){
          @Id
          private Integer id;

          @Colunm(name = "nameEmp")
          private String name;


          @OneToOne
          @JoinColumn(name = "computer_id")
          @MapsId
          private Computer computer;
}

为什么?

@OneToOne注释指示实体之间的关系。

@SequenceGenerator是多余的,因为我们从计算机实体“复制”了ID。

@Id注释是必需的,以指示此字段是我们的主键。

最后但并非最不重要的一点是,@ MapsId注释起到了神奇作用,它从关系中“借用”了ID。

我之前附加的链接中的更多信息。