您好,我的vaadin和实体的延迟加载存在问题 我的实体通过这种方式包含一对多和一对多的关系
@Entity
@Table(name = "Categories")
public class Category extends AbstractEntity {
private static final long serialVersionUID = 1L;
private String name;
@ManyToOne
@JoinColumn(name = "parent")
private Category parent;
@Column
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private List<Category> children = new ArrayList<>();
public Category() { }
所以我有这个控制器
@Transactional
public class CategoryService{
@PersistenceContext
private EntityManager em;
public void save(Category category) {
..
}
public Collection<Category> all() {
return em
.createQuery("select category from Category category",Category.class)
.getResultList();
}
当我尝试为每个实体加载并打印她的孩子时,它成功了,但是已经安装好了。当我在vaadin中使用表格并调用service.all()时 并尝试做同样的事情我有
org.hibernate.LazyInitializationException:无法懒惰 初始化一个角色集合:models.Category.children,不能 初始化代理-没有会话
服务:
@Inject
public CategoriesView(CategoryService service) {
this.service = service;
list= (List<Category>) service.all();
}
@Override
protected Component initContent() {
HorizontalLayout layout = new HorizontalLayout();
for (Category cate : list) {
System.out.println(cate.getChildren());
}
}
我该怎么做才能获得想要的结果?
答案 0 :(得分:0)
我通过这种方式解决了我的问题 我在我的enter方法中初始化了数据提供者,而我做到了
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
parents = DataProvider.ofCollection(service.all());
parentGrid.setDataProvider(parents);
}
编辑我也将我的selectionListener放入enter方法