首页 > 解决方案 > 2个表的序列中的相同ID - JPA

问题描述

我有 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;
}

我需要用相同的 id 保存员工和计算机,由 Employe save 生成​​。

标签: javaspringhibernatejpasequence-generators

解决方案


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

  1. 添加@OneToOne注释以指示 Employee 和 Computer 是相关的。
  2. 从您的 Computer 实体中删除有关@SequenceGenerator的信息并添加@Id注释
  3. 添加@MapsId注释。[更多信息]

所以它看起来像这样:

@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。

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


推荐阅读