Как я могу сохранить сложную сущность с объектами стратегии в JPA?

Я использую Spring boot JPA для разработки проекта DDD. Я использовал orm на основе аннотаций для сохранения объектов домена в DAO. Но теперь модель предметной области стала настолько сложной, что я рассматриваю возможность реализации шаблона стратегии на предметных объектах предметной области.

Вот пример:

@Entity
class ComplexEntity {
    @Id
    private String id;

    // ... other simple fields

    // Example of a strategy object
    // Which deals with complex logics
    private StrategyObject strategyObject;

    // Business methods here
    public void doLogic(OtherEntity other) {
        strategyObject.performOn(other);
        // other logics...
    }
}

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

Как должен выглядеть объект StrategyObject в базе данных? Это отдельная таблица, относящаяся к текущему или одному / нескольким значениям в текущей таблице?

Igor Stetsiura 08.04.2018 04:22

Я хочу сделать несколько значений в текущей таблице, в основном потому, что объект стратегии часто берется из исходного класса, который имеет слишком много полей и логики. Абстракция объекта стратегии существует по двум причинам: 1. сокращение исходного класса; 2. упростить создание новых классов с изменением лишь небольшой части логики, в то время как другие остаются.

Czyhandsome 08.04.2018 09:27

Как аннотируется StrategyObject? Для начала, StrategyObject следует аннотировать с помощью @OneToOne в ComplexEntity. Включите код StrategyObject, чтобы понять, какие поля необходимо сохранить.

Guillem 08.04.2018 12:52

StrategyObject - это просто оболочка некоторых полей и методов, которые могут повторно использоваться или расширяться другими классами. Например: Исходный класс может иметь следующие элементы: class Original {private int a; частная строка b; public void doSomething () {// Делаем что-нибудь с a, b ...} class WithStrategy {private StrategyObject so; public void doSomething () {so.doSomething; }

Czyhandsome 10.04.2018 09:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
780
2

Ответы 2

К сожалению, это невозможно сделать с помощью JPA, но Hibernate поддерживает такую ​​возможность.

Как реализовать собственный составной тип пользователя

Я бы создал перечисление

public enum Strategy {

    public abstract StrategyObject getImplementation();

    STRATEGY_1 {
         public StrategyObject getImplementation() {
              return new Strategy1();
         },
    STRATEGY_2 {
         public StrategyObject getImplementation() {
              return new Strategy2();
         }
}

а затем укажите в своей сущности ссылку на перечисление Strategy:

@Entity
class ComplexEntity {
    @Id
    private String id;

    @Enumerated(EnumType.STRING)    
    private Strategy strategy;

    public void doLogic(OtherEntity other) {
        strategy.getImplementation().performOn(other);
    }

}

Обновлено: Думаю, я пропустил ту часть, где стратегии могут иметь значительный объем конфигурации, которую необходимо сохранить. Но, может быть, это начало.

Это вполне уместно и удобно, когда в стратегии не требуется сохранять какие-либо данные в БД, а нужна только чистая логика. Но если мне нужно что-то сохранить в объекте стратегии, Enum-Solution недостаточно.

Czyhandsome 18.04.2018 03:00

Другие вопросы по теме