Hibernate: 拉取所有延迟集合的最佳做法

117

我所拥有的:

@Entity
public class MyEntity {
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
  @JoinColumn(name = "myentiy_id")
  private List<Address> addreses;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
  @JoinColumn(name = "myentiy_id")
  private List<Person> persons;

  //....
}

public void handle() {

   Session session = createNewSession();
   MyEntity entity = (MyEntity) session.get(MyEntity.class, entityId);
   proceed(session); // FLUSH, COMMIT, CLOSE session!

   Utils.objectToJson(entity); //TROUBLES, because it can't convert to json lazy collections
}

问题:

问题是当会话关闭后,我无法提取懒加载的集合。但我也不能在proceed方法中不关闭会话。

解决方案(粗略解决方案):

a) 在会话关闭之前,强制Hibernate提取懒加载的集合。

entity.getAddresses().size();
entity.getPersons().size();

b) 更加优雅的方式可能是使用@Fetch(FetchMode.SUBSELECT)注解。

问题:

将我的对象转换为JSON,有什么最佳实践/常见方法/更加优雅的方式吗?

12个回答

0

您可以在实体上使用@NamedEntityGraph注释来创建可加载查询,以设置要在查询中加载哪些集合。

这种方法的主要优点是,当您选择使用此图形时,Hibernate仅执行一次检索实体及其集合的查询,如下所示:

实体配置

@Entity
@NamedEntityGraph(name = "graph.myEntity.addressesAndPersons", 
attributeNodes = {
    @NamedAttributeNode(value = "addresses"),
    @NamedAttributeNode(value = "persons")
})

使用方法

public MyEntity findNamedGraph(Object id, String namedGraph) {
        EntityGraph<MyEntity> graph = em.getEntityGraph(namedGraph);

        Map<String, Object> properties = new HashMap<>();
        properties.put("javax.persistence.loadgraph", graph);

        return em.find(MyEntity.class, id, properties);
}

-2

尝试使用 Gson 库将对象转换为 Json

Servlets 示例:

  List<Party> parties = bean.getPartiesByIncidentId(incidentId);
        String json = "";
        try {
            json = new Gson().toJson(parties);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(json);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接