在Hibernate中使用Lazy加载而不是急切加载

时间:2015-01-13 10:59:29

标签: spring hibernate spring-mvc

我正在开发一个Spring-MVC应用程序,用户可以在其中注册产品和productImages。现在有3个表,用户,产品,ProductImages。除非用户明确地进入有模态的产品,否则并不总是需要拉出所有的productImages,然后用户可以选择要加载的图像。

所以我想到使用LazyLoading而不是EagerFetching。但是我得到了lazyLoadException。所以我在Product和ProductImages中手动打开了一个会话,我得到了一个ObjectNotFound异常。问题是,productImages与产品有外键关系,所以我必须先保存产品才能保存图像,这就是我遇到问题的地方。请建议我在这种情况下如何使用延迟加载。错误日志和代码如下:

错误日志:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.WirTauschen.model.ProductImage#1150]
    org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:253)
com.WirTauschen.dao.ProductBasicDaoImpl.updateProduct(ProductBasicDaoImpl.java:50)

控制器:

 @RequestMapping(value = "/product/addimages", method = RequestMethod.POST)
    public @ResponseBody String addProductImages(@RequestParam("productImages") MultipartFile[] uploadedFiles){

    if(uploadedFiles != null && uploadedFiles.length>0) {
        for (MultipartFile uploadedFile : uploadedFiles) {
            try {
                if (!(uploadedFile.isEmpty())) {
                    imagesList.add(uploadedFile.getBytes());
                }
            } catch (IOException e) {
                e.printStackTrace();
                return "image failed to upload";
            }
        }
    }
   return "done";
}



@RequestMapping(value="/product/add",method = RequestMethod.POST)
    public String addProduct(@ModelAttribute("product") ProductBasic productBasic,Model model){
        model.addAttribute("product", new ProductBasic());
        productBasic.setProductimage(productprofileimage);
      int productid = productBasicService.addProduct(productBasic);
        ProductBasic productBasic1 = this.productBasicService.getProductById(productid);
            for (int index = 0; index < imagesList.size(); index++) {
                if (index == 0) {
                    productBasic1.setProductimage(imagesList.get(0));
                }
                ProductImage productImage = new ProductImage();
                productImage.setProductimage(imagesList.get(index));
                this.productImageService.addProductImage(productBasic1, productImage);
            }
            productBasicService.updateProduct(productBasic1);
           imagesList.clear();
        productprofileimage =null;
        return "redirect:/product/show";
    }

ProductDAOImpl:

@Override
    @Transactional
    public int addProduct(User user, ProductBasic productBasic) {
// I was using getSessionBefore with Eager, it worked, thought of trying openSession
        session = this.sessionFactory.openSession();
        user.getProductBasics().add(productBasic);
        productBasic.setUser1(user);
        session.save(productBasic);
        System.out.println("Returned product information is"+productBasic.getProductid());
        session.flush();
        //session.close();
        return productBasic.getProductid();
    }

 @Override
    @Transactional
    public void updateProduct(User user,ProductBasic productBasic) {
        logger.debug("Editing product information");
        session = this.sessionFactory.getCurrentSession();
      //  User user1 = (User) session.get(User.class,id);
        user.getProductBasics().add(productBasic);
        productBasic.setUser1(user);
        session.saveOrUpdate(productBasic);
        session.flush();
    }

ProductImageDAOImpl:

@Override
    @Transactional
    public boolean addProductImage(ProductBasic productBasic,ProductImage productImage) {
            session = sessionFactory.openSession();
            productBasic.getProductImageSet().add(productImage);
            productImage.setProductimageupload(productBasic);
            productBasic.setImagecount((productBasic.getImagecount()+1));
            session.merge(productBasic);
            session.saveOrUpdate(productImage);
            return true;

    }

控制器代码不应该包含那么多服务端信息,但这只是为了确保它有效。我在模型中定义了LazyLoading,如果需要可以发布代码,请告诉我是什么我做错了。任何指针都是受欢迎的。感谢您的时间。

1 个答案:

答案 0 :(得分:1)

扩展我的评论

  1. 删除上面的saveOrUpdate。
  2. 将级联类型更改为ALL
  3. PS:您在UpdateProduct方法中遇到异常。但你发布了addProduct的代码。