Как обработать ключ, являющийся одновременно и первичным, и внешним в 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.