当前位置: 首页 > 面试题库 >

Hibernate:删除所有懒惰集合的最佳实践

谭翔
2023-03-14
问题内容

我有的:

@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。


问题答案:

Hibernate.initialize()在内部使用@Transactional初始化惰性对象。

 start Transaction 
      Hibernate.initialize(entity.getAddresses());
      Hibernate.initialize(entity.getPersons());
 end Transaction

现在,在Transaction之外,您可以获取惰性对象。

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


 类似资料:
  • 我正在尝试使用实体图来触发加载的惰性集合,但不幸的是,实体图也会触发所有嵌套集合。我正在使用spring-data-jpa-entity-graph库在运行时创建实体图。 带有 JPA 存储库的 Spring 服务: 在这种情况下,服务还为每辆车返回零件收集,但我只想获取每个品牌的车辆收藏的品牌列表。 我们如何在第一级触发加载懒惰集合(仅限品牌车辆-没有车辆零件)?

  • 问题内容: 在Hibernate中删除表中所有行 的最佳方法是什么? 如果我遍历一个集合并称其在我所知范围内没有执行。 如果使用其他选项,则不会影响持久性上下文。 如果没有更好的选择,何时应该使用这些方法? 问题答案: 如果没有什么要层叠的,请使用HQL删除 如果您有层叠,请迭代该集合并分别删除每个集合。 问题出在以下事实:hibernate在内部处理级联,而不是将其留给数据库。因此,发送查询不会

  • 问题内容: 我正在寻找清除整个收藏夹的方法。我看到有一个批处理更新选项,但这需要我知道集合中的所有文档ID。 我正在寻找一种简单地删除集合中每个文档的方法。 谢谢! 编辑:下面的答案是正确的,我使用以下方法: 问题答案: 没有API可以一次性删除整个集合(或其内容)。 从Firestore文档中: 要在Cloud Firestore中删除整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。

  • 据我所知,我可以使用云函数以某种方式实现这一点?我试着阅读云函数,但我很迷路。是否有一种方法可以触发云函数,在用户更新帖子时删除子集合中的所有文档?

  • 我认为这个问题本质上是关于可变性背景下的懒惰是什么。 在Scala编程(或文档)中,他们给出了如何在不可变和可变集合上使用视图的示例。在该节中,它们指出 视图并不复制这些元素,它只是提供对它们的引用。 我明白为什么我们会得到那个答案。但是transformer有什么懒惰的呢?我把懒惰理解为只在需要时才计算值(就像不可变集合的例子一样)。但是,中的值从不计算,它们只是对中的值的引用,即使在调用之后也

  • 问题内容: 我发现从Hibernate的集合中删除orphan记录并没有被删除。我一定在做一些简单的错误(这是Hibernate-101!),但是我找不到它。 给定以下内容: 以及以下更新代码: DAO片段: 以下测试失败: 总而言之,我发现: 从作者的藏书中删除该书后,该书仍存在于数据库中 如果我检查,那本书不存在该书 这种“感觉”就像我没有刷新会话或适当地强制进行更新-但我不确定应该在哪里进行