Что вы думаете о разделении моделей постоянства и моделей предметной области? Я читал, что вам не нужно смешивать проблемы сохранения с вашими бизнес-задачами (DDD, чистая архитектура, Мартин Фаулер, Эрик Эванс и многое-многое другое). Тем не менее, я все еще вижу во всех проектах модели предметной области, аннотированные непосредственно такими аннотациями ORM, будучи моделью предметной области, связанной с механизмом персистентности, достигающей анемичной модели и нарушающей другие принципы.
//PersistenceJPA entity
@Entity
@Table(name="training_cycle")
class TrainingCycle {
@Id
private Long id;
private String name;
@Column(name="discipline_id")
@JoinColumn(name="discipline_id")
private Long disciplineId; //Referencing by Id because Discipline is another Aggregate ROOT
//EmptyConstructor, getters and setters avoided
}
//PersistenceJPA entity
@Entity
@Table(name="training_cycle")
class Discipline {
@Id
private Long disciplineId;
private String name;
//EmptyConstructor, getters and setters avoided
}
Поэтому, если вы хотите следовать чистым принципам, вам нужно разделить модель домена и модель постоянства (как показано ниже), чтобы иметь модель домена с бизнес-поведением (это позволяет избежать анемичной модели и следует SRP), и поэтому вам необходимо сопоставить модель домена с модель постоянства (с типичными методами, такими как mapToEntity(DomainModel DM) и mapToDomain(PersistenceModel PM), возможно, в преобразователе/преобразователе, возможно, в классе репозитория), когда вы хотите взаимодействовать с Datastore и наоборот, когда вы хотите получить данные из базы данных.
class Discipline {
private DisciplineId disciplineId;
private String name;
public Discipline(DisciplineId disciplineId, String name) {
this.disciplineId = disciplineId;
this.name = name
}
}
public class TrainingCycle{
private TrainingCycleId trainingCycleId;
private String name;
private DisciplineId disciplineId;
public TrainingCycle(TrainingCyleId trainingCycleId, String name, DisciplineId disciplineId) {
this.trainingCycleId = trainingCycleId;
this.name = name;
assignDiscipline(disciplineId);
}
public void assignDiscipline(DisciplineId aDisicplineId) {
if(aDisicplineId == null) {
throw new IllegalArgumenException("Discipline cannot be null")
}
this.disciplineId = aDisicplineId;
}
}
@Entity
@Table(name="training_cycle")
class TrainingCycleJpa {
@Id
private Long id;
private String name;
@Column(name="discipline_id")
@JoinColumn(name="discipline_id")
private Long disciplineId; //Referencing by Id because Discipline is another Aggregate ROOT
//EmptyConstructor, getters and setters avoided
}
@Entity
@Table(name="training_cycle")
class DisciplineJpa {
@Id
private Long disciplineId;
private String name;
//EmptyConstructor, getters and setters avoided
}
class TrainingCyleJpaRepository implements TrainigCycleRepository {
public void create(TrainingCycle trainingCycle) {
entityManager.persist(this.mapToEntity(trainingCycle)
}
public TrainingCycle create(TrainingCycleId trainingCycleId) {
return this.mapToDomain(entityManager.find(TrainingCycleId));
}
}
Итак, обсуждение/вопрос заключается в том, чтобы разделить или не разделить модель персистентности из модели домена? Когда разделять, а когда нет? В большинстве проектов, не говоря уже о тех, которые я видел в качестве примера, я видел, как они объединяют аннотации модели постоянства в модели предметной области, в то время как гуру всегда торгуют DataStore — это деталь.
Большое спасибо.