【问题标题】:How can I persist complex entity with Strategy objects in JPA?如何在 JPA 中使用 Strategy 对象持久化复杂实体?
【发布时间】:2018-09-17 17:00:51
【问题描述】:

我正在使用 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 应该是什么样的?它是一个单独的表,引用当前表中的当前值还是一个/多个值?
  • 我想在当前表中使其成为多个值,主要是因为策略对象通常取自具有太多字段和逻辑的原始类。策略对象的抽象有两个原因: 1. 原始类的缩写; 2. 轻松创建新类,只更改一小部分逻辑,而其他部分保持不变。
  • StrategyObject 是如何注解的?StrategyObject 应该在 ComplexEntity 中使用@OneToOne 进行注解,首先。请包含 StrategyObject 代码,以便了解需要保留哪些字段
  • StrategyObject 只是一些可能被其他类重用或扩展的字段和方法的包装。例如:原始类可能有这些东西:class Original { private int a;私人字符串 b; public void doSomething() { // 用 a, b 做某事... } class WithStrategy { private StrategyObject so; public void doSomething() { so.doSomething; }

标签: java orm domain-driven-design


【解决方案1】:

不幸的是,JPA 无法做到这一点,但 Hibernate 支持这种可能性。

How to implement custom composite user type

【讨论】:

    【解决方案2】:

    我会创建一个枚举

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

    然后在您的实体中引用策略枚举:

    @Entity
    class ComplexEntity {
        @Id
        private String id;
    
        @Enumerated(EnumType.STRING)    
        private Strategy strategy;
    
        public void doLogic(OtherEntity other) {
            strategy.getImplementation().performOn(other);
        }
    
    }
    

    编辑:我想我错过了策略可能需要存储大量配置的部分。但也许这是一个开始。

    【讨论】:

    • 当策略不需要在DB上持久化任何数据,只需要纯逻辑的时候,是相当合适和方便的。但是如果我需要在 Strategy Object 中存储一些东西,那么 Enum-Solution 就不够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2016-03-13
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多