Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建时生成DDD实体标识_Java_Hibernate_Domain Driven Design_Entity - Fatal编程技术网

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