2016-08-11 11 views
1

Я читаю о DDD, и я узнал, что объект Value неизменен, если вы хотите его изменить, вам нужно будет создать новый. Я только что прочитал информацию о How are Value Objects stored in the database?, он хорошо работает для класса адресов, и я также читаю https://cargotracker.java.net/ и https://gojko.net/2009/09/30/ddd-and-relational-databases-the-value-object-dilemma/. Но я хочу сделать что-то другое.DDD - обновить объект значения в базе данных с FK dependencie

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 есть много записей, если я изменить период записи даты (значение объекта, таблица TPERIOD) создаст еще один период объектов, то id_period изменится (удалить, вставить запись), но внешний ключ в таблице TCall будет нарушена. Как я могу реализовать класс периода? если я реализую как объект значения, он будет неизменным и окажется, что я ничего не смогу изменить.

Спасибо, Fernando

+0

Короткий ответ - если у вас есть (необходимо) идентификаторы (например, 'id_period', id_call' '), то это не объект Value (VO), это объект. Если нужны идентификаторы, чтобы FK тогда попытался создать модель домена, не задумываясь о постоянстве, зависимостях FK, таблицах БД. –

ответ

0

если это значение объекта не имеют периода таблицы/идентификатор.

Объект value - это просто группировка определенных полей. Например, у вызова может быть время начала, время окончания, а затем вы можете создать объект значения продолжительности с временем начала и временем окончания из таблицы вызовов. В вашем java-коде было бы более удобно говорить о длительности вызова вместо времени начала/окончания отдельно.

Однако, конечно, имеет смысл сделать период сущностью, но тогда период 201601 всегда имеет одинаковое время начала и окончания, и вам не нужно будет вносить в него изменения. И если вы сделали, вы вносите изменения в объект напрямую и сохраняете идентификаторы в такте.

0

Спасибо за вашу помощь,

меня такая ситуация:

TPerson - поля: id_person = 1, имя = "John" Tmobile - поля: id_mobile = 100, номер "555-01-23" 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, в этом примере у Джона есть мобильный между «2016-01-01» и d "2049-12-31". На столе TCall есть запись звонков Джона, но если я заменил период (таблица TPeriod) end_date на «2016-02-01», из моего понимания end_date будет непоследовательным, оказывается, что я не могу заменить, потому что это value, а не объект. Я решил реализовать это.

// 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 атрибут

Благодарим Вас за внимание к этому вопросу