Отображение один в один в Hibernate? - PullRequest
0 голосов
/ 11 октября 2018

Предположим, у нас есть две таблицы базы данных Instructor и Instructor_Details.Они имеют отношение один к одному, так что каждый инструктор может иметь одну деталь инструктора, а одна деталь инструктора связана только с одним инструктором.

В чистых терминах базы данных таблица Instructor должна быть родительской для таблицы Instructor_Detailsи первичный ключ таблицы Instructor должен использоваться как внешний ключ в таблице Instructor_Details.

Я изучал Hibernate, и большинство примеров @OneToOne в Интернете изменили таблицы так, что первичный ключ Instructor_Details используется в качестве внешнего ключа в таблице Instructor, что кажется противоречивым как Instructor должен быть родителем Instructor_Details.

Как наилучшим образом реализовать обе сущности, чтобы я мог использовать первичный ключ Instructor в качестве внешнего ключа в Instructor_Details.Также, пожалуйста, объясните типы выборки и каскад в моей желаемой реализации.Примеры с кодом будут очень полезны.

Редактировать

Допустим, атрибуты для таблиц следующие:

Instructor (instructor_id (primaryключ), first_name, last_name)

Instructor_Details (detail_id (первичный ключ), dob, address, instructor_id (внешний ключ из таблицы инструкторов))

1 Ответ

0 голосов
/ 11 октября 2018

Поскольку с точки зрения чистой базы данных вы моделируете это как родитель / потомок, вы застряли с OneToMany.То, что я сделал в этой ситуации, так что я могу сохранить такие отношения и воспользоваться такими преимуществами, как каскадное удаление и т. Д. - это иметь вспомогательные методы для самих сущностей.Поскольку Hibernate использует отражение, вам на самом деле не нужно реализовывать общедоступные методы получения и установки для своих частных членов.

Так, например, ваш метод доступа к классу InstructorDetails Instructor может выглядеть следующим образом:

public class Instructor {

    ...
    @OneToMany
    private List<InstructorDetails> instructorDetails;

    public Optional<InstructorDetails> getInstructorDetails() {
        if (instructorDetails == null || instructorDetails.size() == 0) {
            return Optional.empty();
        } else if (instructorDetails.size() > 1) {
            // Optional raise if you want to be aware of corrupt Instructors that have many details
            throw Exception("There's corrupt data");
        } else {
            return Optional.of(instructorDetails.get(0));
        }
    }

    ...
}

Имеет смысл?То же самое для добавления ... у вас может быть добавление, которое берет одну деталь, проверяет, есть ли уже, и перезаписывает или выбрасывает, но внутренне это имеет дело со списком.Тот, кто имеет дело с Instructor, никогда не узнает, что внутри него есть список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...