将实体集合映射到其 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>
我正在构建一个 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>