我目前正在我的 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/