Jpa 如何实施沃恩·弗农&x27;DDD中关于聚合中引用的建议
遵循DDD中关于骨料中参考文献的沃恩·弗农建议 让聚合通过ID(标识)引用其他聚合,而不是聚合本身 如何用JPA和Hibernate4.3.11.Final来完成这一点 我尝试使用: 差不多Jpa 如何实施沃恩·弗农&x27;DDD中关于聚合中引用的建议,jpa,domain-driven-design,spring-data-jpa,Jpa,Domain Driven Design,Spring Data Jpa,遵循DDD中关于骨料中参考文献的沃恩·弗农建议 让聚合通过ID(标识)引用其他聚合,而不是聚合本身 如何用JPA和Hibernate4.3.11.Final来完成这一点 我尝试使用: 差不多 @Entity public class OrdenItem implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyTo
@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数据检索某个实例时
@Query(""
+ " SELECT b "
+ " FROM OrdenItem b "
)
List<OrdenItem> findByYYYY();
但我想按照沃恩·弗农的建议去做
@ManyToOne(targetEntity = Product.class, optional = false)
并将orderId和productId作为数字保留在表中
@Column(name="PRODUCT_ID")
就这样
如果您想获取订单及其项目,然后获取字符串表示,您需要产品名称,我认为您需要从中检索每个订单项目的产品。
请允许我说,沃恩会这么做:
首先,我根本不需要通过OrderItem的标识符orderId保存OrderItem到Order的引用,这样您就可以安全地删除它。从域服务中,您所要做的只是检索order aggregate根及其聚合项集合。我不会让每个项目都包含productId,而是将其更改为使每个orderItem包含我产品的另一个概念标识,它必须是产品SKU或其他东西,并且您可以保留其名称,就像它是真实世界中的订单一样。无论如何,这些值根本不会改变,是不变的
塞巴斯蒂安。一段长的关系不是关系,而是结束。JPA不支持,也可能永远不会支持使用任意的Long来表示某种实体类型的对象。坏主意,不是O-O。在长条上指定多个选项是完全错误的。谢谢你,尼尔,但是请在沃恩·弗农的推荐中给我你的反馈。我同意你的观点,感谢你推荐从ordeitem中删除orderid,我认为orderitem应该是一个值对象而不是实体。我将保留产品Id和sku副本以及产品的其他数据。你知道JPA是否有可能在没有@manytoone anotation的情况下自动生成外键?只要忘记外键,你甚至可以忘记持有productId,并且通过产品SKU仍然拥有概念标识,因此没有外键
@Column(name="PRODUCT_ID")