如何使用主键作为JPA和Hibernate的外键引用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用主键作为JPA和Hibernate的外键引用?相关的知识,希望对你有一定的参考价值。

我想创建一个表格,其中一个对象的primary key也应该作为两个foreign key表的@ManyToOne

是否可以在不创建额外的表列的情况下引用和重复相同的主键ID?

例:

@Entity
public class Person {
    @Id
    private int personId;

    @ManyToOne
    @JoinColumn(name="fk_address_id", foreignKey=@ForeignKey(name="fk_address"))
    private Address address;

    @ManyToOne
    @JoinColumn(name="fk_location_id", foreignKey=@ForeignKey(name="fk_location"))
    private Location location;
}

问题:@IdAddressLocation总是与@IdPerson相同。上面的映射将导致hibernate生成3列。 id, fk_address, fk_location,其中每列具有相同的值(id)。

问题:是否有可能只为这个人使用primary key @Id,同时告诉hibernate这是更多@ManyToOne外键映射的外键,没有创建这些列?

答案

假设你在PersonPersonAddressPersonLocation之间有一对一的关联,你需要使用@MapsId JPA注释,因为it is the best way to map a one-to-one table relationship

我为此添加了一个示例on GitHub。基本上,您可以映射这样的关联:

@Entity(name = "Person")
public class Person  {

    @Id
    private Long personId;

    @OneToOne
    @MapsId
    @JoinColumn(name = "personId")
    private PersonAddress address;

    @OneToOne
    @MapsId
    @JoinColumn(name = "personId")
    private PersonLocation location;
}

以上是关于如何使用主键作为JPA和Hibernate的外键引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPA 中获取外键引用以具有“ON UPDATE CASCADE ON DELETE CASCADE”功能?

hibernate one-to-many 和 many-to-one

使用JPA和Hibernate提供程序的ManyToMany关系不会创建主键

如何使用 JPA 和 Hibernate 在非主键上连接表

VARCHAR 作为数据库中的外键/主键好还是坏?

hibernate表关系