Java 创建时生成DDD实体标识
我在我的领域有一个实体:Java 创建时生成DDD实体标识,java,hibernate,domain-driven-design,entity,Java,Hibernate,Domain Driven Design,Entity,我在我的领域有一个实体: public final class FieldDefinition { private final FieldDefinitionId id; private final FieldName name; //other fields public FieldDefinition(final FieldDefinitionId id, final FieldName name) { check
public final class FieldDefinition {
private final FieldDefinitionId id;
private final FieldName name;
//other fields
public FieldDefinition(final FieldDefinitionId id,
final FieldName name) {
checkState(id, name, label, type);
this.id = id;
this.type = type;
}
private void checkState(final FieldDefinitionId id,
final FieldName name) {
Preconditions.checkState(nonNull(id), "id cannot be null");
Preconditions.checkState(nonNull(name), "name cannot be null");
如您所见,创建对象时需要FieldDefinitionId。此id在数据库实体中生成:
@Entity
public final class FieldDefinitionJpaEntity implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
private long id;
@Column(length = 50, nullable = false)
private String name;
....
}
“id”与FieldDefinitionId相同。它是这样映射的:
private FieldDefinition asDomainField(final FieldDefinitionJpaEntity entity) {
return new FieldDefinition(
new FieldDefinitionId(entity.getId()),
new FieldName(entity.getName()),
// other fields
}
现在我从另一个需要保存到数据库的服务接收FieldDefinitionDto。这是上课时间
class FieldDefinitionDto {
private final String name;
//other fields
}
正如您所看到的,DTO对象内部没有id。现在,当我试图将DTO映射到域模型时,我不能这样做,因为需要FieldDefinitionId。我该怎么办?我是否应该为创建创建创建单独的模型,如FieldDefinitionCreation,它基本上与FieldDefinition相同,但没有FieldDefinitionId?。我希望坚持在数据库级别生成id(而不是在具有UUID的域级别)。有人有类似的问题吗?保持两个几乎相同的独立模型是一个好主意吗?您的ID生成策略与您的域模型设计不一致
@GeneratedValue(strategy=IDENTITY)
表示实体保存时DB将生成标识。如果选择此策略,则不能在字段定义
的类中使id
成为必需的构造函数参数
我也有点困惑,为什么你不直接用JPA映射FieldDefinition
,而不是使用fielddefinitionJPAEEntity
无论如何,您可以预先使用指定的ID(仍然可以在DB中生成),例如
或者在持久化时使用生成的ID,例如
FieldDefinition fd = new FieldDefinition(name); //no ID yet
fieldDefinitionRepository.save(fd); //ID assigned
我总是倾向于提前生成id,因为生成域事件要容易得多。从您提供的代码来看,FieldDefinitionJpaEntity#id和FieldDefinition#id之间的关系不清楚。提供映射这些类的代码。FieldDefinitionJpaEntity#id与FieldDefinition#id相同。FieldDefinitionId只是长id的包装
FieldDefinition fd = new FieldDefinition(name); //no ID yet
fieldDefinitionRepository.save(fd); //ID assigned