LazyInitializationException and PAGE scope
gregtk Jan 19, 2009 8:04 AMHi!
I trying to create administration page for creating gallery. In one of my page I use
rich:fileupload component. But when I upload image and try add it to my Gallery object I catch:
14:45:18,297 WARN [lifecycle] failed to lazily initialize a collection of role: ru.makingpages.chicago.entity.gallery.Gallery.images, no session or session was closed
This is my Gallery.java:
@Entity @NamedQueries({ @NamedQuery(name = "findAllGalleries", query = "select gal from Gallery gal order by gal.date desc") }) public class Gallery implements Serializable { private long id; private String title; private List<Image> images; private Date date; @Id @GeneratedValue public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @OneToMany(mappedBy = "gallery", fetch = FetchType.LAZY) public List<Image> getImages() { return images; } public void setImages(List<Image> images) { this.images = images; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Transient public void addImage(Image image) { images.add(image); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Gallery gallery = (Gallery) o; if (id != gallery.id) return false; if (date != null ? !date.equals(gallery.date) : gallery.date != null) return false; if (images != null ? !images.equals(gallery.images) : gallery.images != null) return false; if (title != null ? !title.equals(gallery.title) : gallery.title != null) return false; return true; } @Override public int hashCode() { int result = (int) (id ^ (id >>> 32)); result = 31 * result + (title != null ? title.hashCode() : 0); result = 31 * result + (images != null ? images.hashCode() : 0); result = 31 * result + (date != null ? date.hashCode() : 0); return result; } }
This is my Seam Component:
@Name("galleryHome") @Scope(ScopeType.PAGE) public class GalleryHome { @In private EntityManager entityManager; @Logger Log log; private Long galleryId; private Gallery instance; @RequestParameter public void setGalleryId(Long id) { galleryId = id; if (id != null) { try { instance = entityManager.find(Gallery.class, id); } catch (Exception ex) { log.error(ex); } } } public Gallery getInstance() { return instance; } public void setInstance(Gallery instance) { this.instance = instance; } public Long getGalleryId() { return galleryId; } public void persist() { //To change body of implemented methods use File | Settings | File Templates. } public void update() { entityManager.merge(instance); } public void processUpload(UploadEvent uploadEvent) { try { org.richfaces.model.UploadItem item = uploadEvent.getUploadItem(); ru.makingpages.chicago.entity.gallery.Image uploadedImage = new ru.makingpages.chicago.entity.gallery.Image(); Image smallImage = buildImage(item.getFile(), 460, 345); Image miniImage = buildImage(item.getFile(), 75, 100); uploadedImage.setContentType(item.getContentType()); uploadedImage.setDate(new Date()); uploadedImage.setSmallImage(smallImage.getImage()); uploadedImage.setMiniImage(miniImage.getImage()); instance.addImage(uploadedImage); log.info("fileUploaded"); } catch (Exception ex) { log.error(ex); } } private Image buildImage(File file, int width, int height) { Image image = new Image(); try { image.setInput(file); if (image.getHeight() > image.getWidth()) image.scaleToHeight(height); else image.scaleToWidth(width); } catch (IOException e) { log.error(e); return null; } return image; } }
and my view:
<h:form id="editForm"> <div> <h:panelGrid columns="1"> <ui:define name="label">#{messages['label.title']}</ui:define> <h:inputText id="title" value="#{galleryHome.instance.title}" size="70" required="true"/> <rich:fileUpload fileUploadListener="#{galleryHome.processUpload}" addControlLabel="#{messages['fileupload.upload']}" stopControlLabel="#{messages['fileupload.stop']}" stopEntryControlLabel="#{messages['fileupload.stop']}" immediateUpload="true" listHeight="150px" autoclear="false" maxFilesQuantity="99" acceptedTypes="gif, jpeg, jpg, png"> <a:support event="onuploadcomplete" reRender="graphics"/> </rich:fileUpload> </h:panelGrid> <a:outputPanel id="graphics"> <ui:repeat var="img" value="#{galleryHome.instance.images}"> <s:graphicImage value="#{img.miniImage}"/> <p/> </ui:repeat> </a:outputPanel> </div> <br/> <rich:separator/> <h:commandButton value="#{messages['button.update']}" action="#{galleryHome.update}"/> </h:form>
I use JBoss Seam 2.1GA
Please somebody help me :)