Hibernate延迟加载-在列表中获取Listitems

时间:2019-08-09 07:49:13

标签: java spring hibernate jpa spring-data-jpa

我目前正在Java应用程序中试用休眠5。 我有以下问题:

我有两个pojos /模型:

@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

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

我希望这个问题不太容易,但是我找不到关于此的任何帮助。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用此方法,并确保在交易边界内使用此方法

List<Link> totalLinks = cats.stream().map(cat -> cat.getLinks()).
            flatMap(l -> l.stream()).collect(Collectors.toList());

答案 1 :(得分:0)

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

取决于使用情况,如果您想使用它。对于小型数据集,绝对可以。