java - Hibernate 延迟加载 - 获取列表中的列表项

标签 java spring hibernate jpa spring-data-jpa

我目前正在我的 java 应用程序中试验 hibernate 5。 我遇到以下问题:

我有两个 pojo/模型:

@Entity(name="Categories")
public class Category {
    @javax.persistence.Id
    private int Id;
    private String Name;
    @OneToMany(mappedBy = "category",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<Link> links = new ArrayList<>();
    // ... getters and setters..
}
@Entity(name="Links")
public class Link {
    @javax.persistence.Id
    private int Id;
    private String Name;
    private String Url;
    @ManyToOne
    @JoinColumn(name="CategoryId")
    private Category category;
    // ... getters and setters..
}

现在我想获取其中包含链接的所有类别。我的方法如下:

public Iterable<Category> getCategories() {
     SessionFactory factory = HibernateUtil.getSessionFactory();
     Session session = factory.getCurrentSession();
     session.getTransaction().begin();

     String hsql = "from " + Category.class.getName() + " e";

     Query<Category> query = session.createQuery(hsql);
     List<Category> cats = query.getResultList();

     cats.forEach(item -> Hibernate.initialize(item.getLinks()));

     session.getTransaction().commit();
     return cats;
    }

这是有效的,但我认为这是一个糟糕的解决方案,无法从所有类别获取所有链接。 我已经尝试过“JOIN FETCH”。

例如,如果我使用:

String hsql =  "from " + Category.class.getName() + " e JOIN FETCH e.links l

我会两次得到所有结果... 从我的列表的所有类别中获取列表“链接”中的所有项目的最佳做法是什么?

我希望这个问题不太容易,但我找不到任何对此有帮助的内容。

最佳答案

您可以使用fetch=FetchType.EAGER代替fetch=FetchType.LAZY,并且hibernate将直接在加载时解析所有链接。

如果您想使用它,取决于用例。对于小数据集来说,这绝对没问题。

关于java - Hibernate 延迟加载 - 获取列表中的列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57425645/

相关文章:

java - 如何从 hibernate 中的实体类的结果中获取数据

java - 如何在java中查找文本中的名称实体

java - Spring不调用setter

java - 如何在 spring 中使用 hibernate 将对象列表映射到表中?

java - 需要帮助来理解 spring 配置文件

java - 我应该如何在 tomcat webapp 中外部化 jar 的配置?

java - JPA + Hibernate + Spring + OneToMany 删除级联

java - 枚举声明调用方法

java - 开发模式的Spring Security预认证

java - 计算随机生成的数字中出现的次数