Java 如何在JPA和Hibernate中将主键也用作外键引用?

Java 如何在JPA和Hibernate中将主键也用作外键引用?,java,hibernate,postgresql,jpa,orm,Java,Hibernate,Postgresql,Jpa,Orm,我想创建一个表,其中一个对象的主键也应该作为两个@ManyToOne表的外键 如果不创建引用和重复同一主键id的额外表列,这是可能的吗 例如: @Entity public class Person { @Id private int personId; @ManyToOne @JoinColumn(name="fk_address_id", foreignKey=@ForeignKey(name="fk_address")) private Addre

我想创建一个表,其中一个对象的
主键
也应该作为两个
@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;
}
问题:
地址
位置
@Id
始终与
个人
@Id
相同。 上面的映射将导致hibernate生成3列<代码>id,fk_地址,fk_位置
,其中每列具有相同的值(id)


问题:是否可以只为person设置
主键
@Id,同时告诉hibernate这是一些
@manytone
外键映射的外键,而不创建这些列?

假设
person
之间存在一对一关联,
PersonAddress
PersonLocation
,您需要使用
@MapsId
JPA注释,因为

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

@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;
}
看看这篇文章。