我正在开发一个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,如果需要可以发布代码,请告诉我是什么我做错了。任何指针都是受欢迎的。感谢您的时间。
答案 0 :(得分:1)
扩展我的评论
ALL
PS:您在UpdateProduct方法中遇到异常。但你发布了addProduct的代码。