【问题标题】:Same ID from sequence for 2 tables - JPA2个表的序列中的相同ID - JPA
【发布时间】:2018-10-15 19:11:32
【问题描述】:

我有 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 生成​​。

【问题讨论】:

标签: java spring hibernate jpa sequence-generators


【解决方案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。

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

【讨论】:

  • 不工作,就是错误:“尝试从空的一对一属性分配 id”
  • 您正在尝试将 Employee 保存在 Employee.computer 为空的位置,将您的计算机实体(已保存)放在那里或放入计算机对象和 CascadeType :)
  • @olivierduque 这里是同样的错误stackoverflow.com/questions/11104897/…
猜你喜欢
  • 2023-03-31
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多