【问题标题】:How to use foreign id as primary id in spring boot jpa?如何在spring boot jpa中使用外国ID作为主ID?
【发布时间】:2018-05-31 14:50:59
【问题描述】:

有没有办法在不使用 Embeddable 或 Id 类的情况下使用另一个实体的主键作为主键。例如:

@Table(name = "employee")
@Entity
public class Employee implements Serializable {

    @Id
    @JoinColumn(name = "person_id")
    private Person person;

这里,Person 是另一个实体,person_id 是主键。 提前致谢

【问题讨论】:

  • Person & Employee @OneToOne 是否相关?

标签: java mysql spring hibernate jpa


【解决方案1】:

是的,如果这是构建 PK 的唯一参数,您可以这样做

public class Employee implements Serializable {

    @Id
    @Column(name="person_id")
    private Long personId;

    @JoinColumn(name = "person_id")
    private Person person;

但是如果是这种情况就没有用了,如果Employee具有相同的主键,那么它们应该在同一个表中,不需要将它们分开在2个表中。

如果我们正在处理包含人的复合主键,那么我们需要创建一个可嵌入的键:

@Embeddable
public class CompositeKey{

   @Column(name="person_id")
   private Long personId;
   ...  // other attributes
}

public class Employee implements Serializable {

    @EmbeddedId CompositeKey employeeId;

    @JoinColumn(name = "person_id")
    private Person person;

另一个注意事项,您的关系注释在哪里,您的人员参考上应该有 OneToOne 注释:

@OneToOne
@JoinColumn(name = "person_id")
private Person person;

【讨论】:

  • 感谢您的回答。我已经对这些东西很熟悉了。不想使用单独的表格或仅可嵌入一个字段。也许,春天在这方面的工作。不过谢谢
【解决方案2】:

对我来说,Employee 似乎可以扩展Person?如果是这种情况,那么继承会以“自然”的方式进行。

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Serializable {
   @Id
   @GeneratedValue
   @Getter
   private Long id;
}

@Entity
public class Employee extends Person implements Serializable {

}

【讨论】:

  • 所以如果我从 Employee 中删除一行,那么它也会从 Person 表中删除吗?或者如果两个表中的两列名称相同但用途不同怎么办?
  • @user2083529 第一次是的。我不知道为什么要使用相同的 ID,除非想指向 same 'entity'。第二,您可以覆盖继承类中的字段,但我不会这样做,而是尽可能根据目的更好地命名字段。
  • 我会投赞成票。虽然这不是我的解决方案。
  • @user2083529 也许您可以添加一些用例/为什么要在您的问题中做这样的事情?是不是你必须忍受一些你无法改变的数据库设计?
  • 是的,数据库设计问题。我想实现 KISS (de.wikipedia.org/wiki/KISS-Prinzip) 。使用外键作为主键可以节省我的服务器大量计算时间和编写一些代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2018-02-11
  • 2018-03-29
  • 2020-04-27
  • 2019-12-17
  • 2021-12-02
相关资源
最近更新 更多