【问题标题】:Return Entity object or POJO to UI?将实体对象或 POJO 返回到 UI?
【发布时间】:2017-12-26 12:41:08
【问题描述】:

我有 JPA Employee 持久实体 wjich 有 50 个字段。有时我需要向 UI 显示所有 50 个字段,或者有时比这要少得多。

我能想到两种方法

方法一:-

我将继续将 Employee 实体返回给 UI。有一些方法(带注释)我可以提到Employee下的哪些特定字段需要返回

示例:-

如果我想在将 json 返回到浏览器之前忽略 Employee 类中的 MiddleName,我将创建 EmployeeMixin 和所需的 @JsonIgnoreProperties,如下所示

@JsonIgnoreProperties({"MiddleName"})
public abstract class EmployeeMixin extends Employee{

}




Employee employee = new Employee ();
Map<Class<?>, Class<?>> mixinMap = new HashMap<Class<?>, Class<?>>();
mixinMap.put(Employee.class, EmployeeMixin.class);
ObjectMapper mapper = new ObjectMapper(mixinMap);
return mapper.writeValueAsString(employee);

方法2:-

我将再次创建包含所有 5o 字段的新 POJO 并返回 UI。

我的问题是哪种设计方法更好?我应该将 Entity 对象还是新的 Pojo 对象(由 Entity 构造)返回给 UI ?

【问题讨论】:

  • 就我而言,方法 1 很好。因为创建具有相同字段的新 pojo 意义不大。所以使用方法 1 并使用注释仅返回必填字段。

标签: java hibernate jpa pojo


【解决方案1】:

我更喜欢方法3,投影

  • 为每个案例创建一个 DTO 对象,其中包含您需要的可变字段集。
  • 创建相应的JPQLCriteriaQuery 以填充适当的DTO

有一个entity 喜欢

@Entity
@Getter
public class Pojo3 {
   @Id
   @GeneratedValue
   private Long id;
   @Setter
   private String f1, f2,f3;
}

你可以创建一个DTO 类,其中包含如下字段的子集

@Getter @Setter
@AllArgsConstructor // Pojo2DTO(id,f1,f2)
public class Pojo2DTO {
   private Long id;
   private String f1,f2;
}

可以像这个测试显示的那样填充到JPQL

@Test
@Transactional
public void test() {
   Pojo3 pojo3 = new Pojo3();
   pojo3.setF1("f1");
   pojo3.setF2("f2");
   pojo3.setF3("f3");      
   em.persist(pojo3);

   // **NOTE** the full package path to DTO object
   TypedQuery<Pojo2DTO> tq = em.createQuery(
         "SELECT NEW org.example.jpa.manyfields.Pojo2DTO(p3.id, p3.f1, p3.f2) "
      + " FROM Pojo3 p3 WHERE p3.id=:id", Pojo2DTO.class);
   tq.setParameter("id", pojo3.getId());

   Pojo2DTO pojo2dto = tq.getSingleResult(); 
   log.info("{}, {}, {}", pojo2dto.getId(), pojo2dto.getF1(), pojo2dto.getF2());

}

【讨论】:

  • 但是 approach_1 有什么问题?使用方法_3,我需要针对每个要求创建多个 DTO
  • @user3198603 如果我理解正确,您将在 A1 中注释实体字段。所以我不确定您将如何分别为每个要求注释实体? A3 将使实体本身保持完整。但是,如果我误解了,您能否提供一个简单的示例,您将如何在 A1 中进行注释?
  • @user3198603 看到你的例子我认为这取决于具体情况。如果你想忽略 49 个字段怎么办?在忽略 20-40 个字段之间的某个地方,这可能只是一个品味问题。但无论如何,您实际上也会在 A1 中创建 DTO(因此具有不同的注释)。我能看到的唯一区别是您总是查询整个实体,但忽略 JSON 序列化中的字段,这可能没什么大不了的。除非您开始将此方法用于大型列表。
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2010-12-26
相关资源
最近更新 更多