jpa - 如何在 DDD 中实现 Vaughn Vernon 关于聚合中引用的建议

标签 jpa domain-driven-design spring-data-jpa

遵循 DDD 中关于聚合引用的 Vaughn Vernon 建议

Let aggregates reference other aggregates by ID (identity), not the aggregate itself.

如何使用 JPA 和 Hibernate 4.3.11.Final 完成这个?

我尝试使用 this example :

有点像

@Entity
public class OrdenItem implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(targetEntity = Orden.class, optional = false)
    private Long ordenId;

    @ManyToOne(targetEntity = Product.class, optional = false)
    private Long productId;
    .
    .
    .

但是当我尝试使用 Spring Data 检索一些实例时

@Query("" 
        + " SELECT b " 
        + " FROM  OrdenItem b "
        )
List<OrdenItem> findByYYYY();

出现如下错误

java.lang.IllegalArgumentException: Can not set java.lang.Long field com.aggregates.model.OrdenItem.ordenId to com.aggregates.model.Orden at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:1.8.0_51] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:1.8.0_51] at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) ~[na:1.8.0_51]

我知道如果我将代码更改为这会起作用

@ManyToOne
private Orden orden;

@ManyToOne
private Product product;

但我想听从 Vaughn Vernon 的建议

最佳答案

刚上车

@ManyToOne(targetEntity = Product.class, optional = false)

并将 orderId 和 productId 作为数字保存在表中。

@Column(name="PRODUCT_ID")

就是这样。

如果您想获取订单及其商品,然后获取字符串表示形式,您将需要产品名称,我认为这就是您想要为每个订单商品检索产品的地方。 请允许我说这就是 Vaughn 会做的事情: 首先,我根本不需要通过标识符 orderId 保存从 OrderItem 到 Order 的引用,这样您就可以安全地删除它。从域服务中,您要做的只是检索订单聚合根及其聚合的项目集合。我不会让每个项目都包含一个 productId,而是将其更改为使每个 orderItem 都包含我的产品的另一个概念标识,它必须是产品 SKU 或其他东西,你也可以保留它的名称,就像它是一个订单一样现实中。无论如何,这些值根本不会改变,是不可变的。

塞巴斯蒂安。

关于jpa - 如何在 DDD 中实现 Vaughn Vernon 关于聚合中引用的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862539/

相关文章:

java - HazelcastSerializationException : Failed to serialize Interface-based Projections

java - JPA - 从一列中获取不同的值(value)

java - 如何使用 Spring+JPA 更新来自 Play Framework 2.0 表单的对象?

domain-driven-design - 事件 Storm 使用什么软件?

scala - 如何将域模型设置为参与者?

Spring Boot JPA Pageable 不适用于大于 0 的页码

java - Spring Data JPA - 连接表上的可分页排序

java - ORA-01461 : can bind a LONG value

java - 如何将两个外键声明为实体中的主键

.net - 如何在领域层使用工作单元