Как обработать ключ, являющийся одновременно и первичным, и внешним в Hibernate?

Есть таблица Applicant, в которой первичный ключ - id - автоинкрементный:

applicant (
    id INTEGER AUTO_INCREMENT,
    PRIMARY KEY(id)
);

И таблица Deal, в которой первичный ключ - applicant_id - это внешний ключ, ссылающийся на Applicant(id):

deal (
    applicant_id INTEGER,
    PRIMARY KEY(applicant_id),
    FOREING KEY(applicant_id) REEFERENCES applicant(id)
);

так реализована связь 1 к 1.

Как эту связь правильно описать в модели Deal в Spring-проекте? Как должна выглядеть модель Deal?


Ответы (1 шт):

Автор решения: Semion Ionov
@Entity
@Table(name = "applicant")
public class Applicant {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(mappedBy = "applicant",
              fetch = FetchType.LAZY)
    private Deal deal;
}

@Entity
@Table(name = "deal")
public class Deal {
    @Id
    @Column(name = "applicant_id")
    private Long applicantId;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private Applicant applicant;
}

@MapsId указывает Hibernate использовать столбец applicant_id таблицы deal в качестве первичного и внешнего ключа.

Также обратите внимание, что столбец id таблицы applicant не использует @GeneratedValue.

Атрибут mappedBy в классе Applicant, поскольку внешний ключ теперь присутствует в таблице deal.

→ Ссылка