DDD - 使用FK依赖项更新数据库中的值对象

时间:2016-08-11 03:47:44

标签: entity domain-driven-design java-ee-7 value-objects

我正在阅读DDD,我已经了解到Value Object是不可变的,如果你想改变它,你将不得不创建一个新的。     我刚刚阅读了How are Value Objects stored in the database?上的信息,它适用于Address类,我还阅读了https://cargotracker.java.net/https://gojko.net/2009/09/30/ddd-and-relational-databases-the-value-object-dilemma/。但我想做点不同的事情。

I am working on a billing system , it has 4 tables/classes
TPerson - fields: id_person, name -> <<Entity>>
TMobile - fields: id_mobile, number -> <<Entity>>
TPeriod - fields: id_period, id_person, id_mobile, begin_date, end_date -> <<Value Object>> (I think, because the dates can be change)
TCall - field: id_call, id_period, etc... -> <<Value Object>>

表TCall有很多记录,如果我更改期间记录日期(Value Object,表TPeriod)它将创建另一个Object Period然后id_period将改变(删除,插入记录),但表TCall中的外键将被侵犯。我该如何实施期间课程?如果我实现为一个值对象,它将是不可变的,结果我将无法改变任何东西。

谢谢, 费尔南多

2 个答案:

答案 0 :(得分:0)

如果它是一个值对象,则表示您没有句号表/ id。

值对象只是某些字段的分组。例如,调用可能具有开始时间,结束时间,然后您可以使用调用表中的开始时间和结束时间创建持续时间值对象。在你的java代码中,分别讨论呼叫持续时间而不是开始/结束时间会更方便。

但是,将句点设为实体当然是有意义的,但是201601期间总是具有相同的开始/结束时间,您不需要对其进行更改。如果您这样做,您可以直接对实体进行更改并保持ID。

答案 1 :(得分:0)

感谢您的帮助,

我遇到这种情况:

TPerson - 字段:id_person = 1,name =“John” TMobile - 字段:id_mobile = 100,数字“555-0123” TPeriod - 字段:id_period = 1000,id_person = 1,id_mobile = 1,begin_date =“2016-01-01”,end_date =“2049-12-31” TCall - 字段:id_call = 1,id_period = 1000

期间是TPerson和TPeriod之间的关系,在此示例中John在“2016-01-01”和“2049-12-31”之间有移动。在表TCall上有John的调用记录,但如果我将句点(TPeriod表)end_date替换为“2016-02-01”,根据我的理解,end_date将不一致,事实证明我无法替换因为它是一个价值对象,而不是实体。我考虑过这样做。

// Create a class DatePeriod
 public class DatePeriod {
    private final begin_date;
    private final end_date;
    DatePeriod() {}
    public static DatePeriod of(Date begin_date, Date end_date) {
        this.begin_date = begin_date;
         this.end_date = end_date;
    }
    // implement equals / hashcode...
}

// Period class
public class Period {
    int id;
    // others mappings id_person / id_mobile
    DatePeriod datePeriod;
}

仍然,我将不得不更新datePeriod属性

感谢您对此事的关注