将实体集合映射到其 ID 集合

Mapping a collection of entities to a collection of their Ids

我正在构建一个 RESTful 服务,我正在使用 Dozer 将 JPA/Hibernate 检索到的我的实体映射到 DTO,反之亦然。让我们假设以下场景。我有 classes EntityA 和 EntityB 以及我的 EntityADto 作为 DTO。

@Entity
public class EntityA {
    @GeneratedValue
    @Id
    private Integer id;
    private EntityB entityB;

    /* Getter & Setter */
}

@Entity
public class EntityB {
    @GeneratedValue
    @Id
    private Integer id;

    /* Getter & Setter */
}

public class EntityADto {
    private Integer id;
    private Integer entityBId;

    /* Getter & Setter */
}

在这种情况下,我可以通过以下映射将 EntityB 类型的 entityB 映射到我的 Integer entityBId:

<mapping>
  <class-a>EntityA</class-a>
  <class-b>EntityADto</class-b>
    <field>
      <a>entityB.id</a>
      <b>entityBId</b>
    </field>
</mapping>

到目前为止这有效。

但是如果我有一个 class EntityA 和一组 EntityB 对象,我无法将它映射到 ID。

@Entity
public class EntityA {
    @GeneratedValue
    @Id
    private Integer id;
    private Set<EntityB> entityBs;

    /* Getter & Setter */
}

public class EntityADto {
    private Integer id;
    private Set<Integer> entityBIds;

    /* Getter & Setter */
}

我宁愿避免使用自定义映射器并尽可能使用 XML 配置。

But if I have a class EntityA with a Set of EntityB objects, I can't get it mapped to the ids.

尝试将 EntityB 映射到 Integer

<mapping>
  <class-a>EntityB</class-a>
  <class-b>Integer</class-b>
    <field>
      <a>entityBs.id</a>
      <b>entityBIds</b>
    </field>
</mapping>

这会导致以下 Exception: org.dozer.MappingException: No read or write method found for field (entityBIds) in class (class java.lang.Integer)

我们无法使用 XML 将 Set<EntityB> 映射到 Set<Integer>,这会导致上述 Exception.

我宁愿建议如下所示更改 DTO 的模型,这对于设计来说也是一个很好的做法。

  public class EntityADto {
        private Integer id;
        private EntityBDto entityBDto;

        /* Getter & Setter */
    }

  public class EntityBDto {
        private Integer id;

        /* Getter & Setter */
    }

然后,如果您有一个 class EntityA 和一组 EntityB 对象。您可以使用以下内容。

@Entity
public class EntityA {
    @GeneratedValue
    @Id
    private Integer id;
    private Set<EntityB> entityBs;

    /* Getter & Setter */
}

public class EntityADto {
    private Integer id;
    private Set<EntityBDto> entityBDtos;

    /* Getter & Setter */
}

我建议更新 DTO 的模型,以便可以使用 XML 配置完成 Dozer 映射。

   <mapping>
      <class-a>EntityB</class-a>
      <class-b>EntityBDto</class-b>
        <field>
          <a>entityBs.id</a>
          <b>entityBDtos.id</b>
        </field>
    </mapping>