如何在JPA中使用Strategy对象保留复杂的实体?

时间:2018-04-08 01:34:36

标签: java orm domain-driven-design

我使用Spring启动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变成了一个我几乎无法处理的严重问题。有没有解决方案来坚持这种复杂的域实体?

2 个答案:

答案 0 :(得分:0)

不幸的是,这不能用JPA完成,但Hibernate支持这种可能性。

How to implement custom composite user type

答案 1 :(得分:0)

我会创建一个枚举

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);
    }

}

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