无法懒惰地初始化集合和vaadin

时间:2018-08-17 04:12:32

标签: java hibernate vaadin lazy-loading

您好,我的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()); 
    }
}

我该怎么做才能获得想要的结果?

1 个答案:

答案 0 :(得分:0)

我通过这种方式解决了我的问题 我在我的enter方法中初始化了数据提供者,而我做到了

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
    parents = DataProvider.ofCollection(service.all());
    parentGrid.setDataProvider(parents);

}

编辑我也将我的selectionListener放入enter方法