Гибернация каскада всех и энверов - PullRequest
0 голосов
/ 25 марта 2020

Я ищу решение и не могу его найти. Наш проект структурирован так (пример):

модуль 1:

  • Человек
  • Автомобиль
    @Audited
    public class Person {
        int id;
        String firstName;
        String lastName;

        @JoinColumn(name = "car_id", referencedColumnName = "id", nullable = false)
        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
        List<Car> cars;
    }

    @Audited
    public class Car {
        String model;
        @ManyToOne(fetch = FetchType.LAZY)
        Person person;
    }

Что мы хотим сделать это разделить сущности и сервисы, связанные в разных модулях. Например : Персональный модуль

  • Персона

Автомобильный модуль

  • автомобиль

Мы хотим сохранить Каскад на юридическое лицо. Но мы не хотим иметь циклическую зависимость c. Мы удаляем ссылку «От автомобиля к человеку»

    @Audited
    public class Person {
        int id;
        String firstName;
        String lastName;

        @JoinColumn(name = "car_id", referencedColumnName = "id", nullable = false)
        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
        List<Car> cars;
    }

    @Audited
    public class Car {
        String model;
    }

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

1 Ответ

0 голосов
/ 25 марта 2020

То, что мы хотим сделать, это разделить сущности и сервисы, связанные в разных модулях.

Реальность заключается в том, что ваше решение технически не делает этого, связь между этими двумя сущностями все еще существует , В первом сопоставлении обе стороны владели ассоциацией, в которой, как и во втором, она единолично принадлежит Person.

Всякий раз, когда вы хотите отделить модели сущностей, подобные этой, обычно более приемлемой практикой является некоторая форма прокси-объекта в одном модуле, который предназначен для ссылки на или предоставления базовой c информации о реальном объекте, который живет в другом месте, в вашем случае - в другом модуле.

Другими словами:

Персональный модуль

  • Персональный объект
  • Автопредприятие (модель прокси)

Автомобиль Модуль

  • Автомобильная сущность
  • Потенциально личность (прокси-модель)

Идея состоит в том, чтобы использовать что-то вроде Debezium или другое триггер / ловушка, чтобы уведомить другие модули, когда реальная сущность изменилась, чтобы ее прокси-модель могла отражать изменения Это позволит вам получить полное представление о модели аудита из одного модуля, а не пытаться получить ее по нескольким модулям, что фактически сводит на нет вашу цель разделения.

Причина, по которой эти "прокси «модели важны тем, что они позволяют модели объекта одного модуля со временем меняться, практически не влияя на модели смежных модулей, которые, вероятно, нуждаются только в подмножестве исходных данных.

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

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

В вашей второй картографической модели нет, это невозможно. Причина этого заключается в том, что в этом случае отношение принадлежит только сущности Person, и модель аудита для Car не имеет представления о том, что она вообще имеет какую-либо связь с таковой Person, поскольку обратного нет ( не обладающего) отображением в модели.

При таком сопоставлении объектов единственный способ, которым это будет работать, заключается в том, что при изменении Person некоторые атрибуты в модели Car необходимо будет изменить так, что это вызовет запись аудита для этой организации. Естественно, что это противоречит всему процессу их разделения в первую очередь, следовательно, посредством комментария относительно альтернативы, чтобы принять необходимость сосуществовать вместе.

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