2015-12-10 9 views
2

Я хотел бы создать таблицу, где primary key объекта должен также служить в качестве foreign key для двух таблиц @ManyToOne.Как использовать первичный ключ также как ссылку на внешний ключ с JPA и Hibernate?

Возможно ли это, не создавая дополнительных столбцов таблицы, ссылающихся и повторяющих один и тот же идентификатор первичного ключа?

Пример:

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

    @ManyToOne 
    @JoinColumn(name="fk_address_id", [email protected](name="fk_address")) 
    private Address address; 

    @ManyToOne 
    @JoinColumn(name="fk_location_id", [email protected](name="fk_location")) 
    private Location location; 
} 

Проблема: @Id для Address и Location всегда то же самое, как @Id от Person. Отображение выше приведет к тому, что спящий режим будет генерировать 3 столбца. id, fk_address, fk_location, где каждый из столбцов имеет одинаковое значение (id).

Вопрос: возможно ли иметь только primary key @Id для человека и в то же время сообщить в спящий режим, что это внешний ключ для некоторых дополнительных сопоставлений внешнего ключа @ManyToOne, без создания этих столбцов?

+0

Посмотрите на [это] (http://stackoverflow.com/questions/29594577/hibernate-how-to-map-two-many-to- много-к-тому-сущности/29603999 # 29603999). – wypieprz

ответ

4

Предполагая, что у вас есть связь один-к-одному между Person, PersonAddress и PersonLocation, вам нужно использовать @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; 
} 
Смежные вопросы