LazyInitializationException عند الإضافة إلى قائمة يتم عقدها داخل فئة كيان باستخدام Hibernate و Gilead لـ GWT

StackOverflow https://stackoverflow.com/questions/2569648

سؤال

حسنًا ، أنا أعمل مع Hibernate Gilead و GWT لاستمرار بياناتي على المستخدمين وملفات موقع الويب. لدى المستخدمين قائمة بمواقع الملفات. أنا أستخدم التعليقات التوضيحية لرسم خريطة فصولي إلى قاعدة البيانات. أحصل على ملف org.hibernate.LazyInitializationException عندما أحاول إضافة مواقع الملفات إلى القائمة التي يتم الاحتفاظ بها في فئة المستخدم.

هذه طريقة أدناه يتم تجاوزها من فئة Servlet لتحميل الملفات الخارجية التي أستخدمها. عندما يقوم الملف بتحميل هذه الطريقة.

يتم تحميل user1 من قاعدة البيانات في مكان آخر. يحدث الاستثناء في user1.getFileLocations().add(fileLocation); . أنا لا أفهمها حقا على الإطلاق.! أي مساعدة ستكون رائعة. تتبع المكدس للخطأ أدناه

public String executeAction(HttpServletRequest request,
            List<FileItem> sessionFiles) throws UploadActionException {
          for (FileItem item : sessionFiles) {
              if (false == item.isFormField()) {
                try {
                    YFUser user1 = (YFUser)getSession().getAttribute(SESSION_USER);

                    // This is the location where a file will be stored

                    String fileLocationString = "/Users/Stefano/Desktop/UploadedFiles/" + user1.getUsername();
                    File fl = new File(fileLocationString);
                    fl.mkdir();
                    // so here i will create the a file container for my uploaded file

                  File file = File.createTempFile("upload-", ".bin",fl);


                  // this is where the file is written to disk

                  item.write(file);

                  // the FileLocation object is then created
                  FileLocation fileLocation = new FileLocation();
                  fileLocation.setLocation(fileLocationString);
                  //test
                  System.out.println("file path = "+file.getPath());



                  user1.getFileLocations().add(fileLocation);

                  //the line above is where the exception occurs 

                } catch (Exception e) {
                  throw new UploadActionException(e.getMessage());
                }
              }
              removeSessionFileItems(request);
            }
            return null;
    }  

// هذا هو ملف الفئة لمستخدم ملفاتك

@Entity
@Table(name = "yf_user_table")
public class YFUser implements Serializable,ILightEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id",nullable = false)
private int userId;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "USER_FILELOCATION", joinColumns = { 
        @JoinColumn(name = "user_id") }, inverseJoinColumns = { 
        @JoinColumn(name = "locationId") })
private List<FileLocation> fileLocations = new ArrayList<FileLocation>() ;

public YFUser(){

}

public int getUserId() {
    return userId;
}

private void setUserId(int userId) {
    this.userId = userId;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public List<FileLocation> getFileLocations() {
    if(fileLocations ==null){
        fileLocations = new ArrayList<FileLocation>();
    }
    return fileLocations;

}

public void setFileLocations(List<FileLocation> fileLocations) {
    this.fileLocations = fileLocations;
}
/*
public void addFileLocation(FileLocation location){
    fileLocations.add(location);
}*/

@Override
public void addProxyInformation(String property, Object proxyInfo) {
    // TODO Auto-generated method stub

}

@Override
public String getDebugString() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Object getProxyInformation(String property) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean isInitialized(String property) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void removeProxyInformation(String property) {
    // TODO Auto-generated method stub

}

@Override
public void setInitialized(String property, boolean initialised) {
    // TODO Auto-generated method stub

}

@Override
public Object getValue() {
    // TODO Auto-generated method stub
    return null;
}

}

@Entity
@Table(name = "fileLocationTable")
public class FileLocation implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "locationId", updatable = false, nullable = false)
private int ieId;
@Column (name = "location")
private String location;


public FileLocation(){

}

public int getIeId() {
    return ieId;
}

private void setIeId(int ieId) {
    this.ieId = ieId;
}

public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}

}

Apr 2, 2010 11:33:12 PM org.hibernate.LazyInitializationException <init>
SEVERE: failed to lazily initialize a collection of role: com.example.client.YFUser.fileLocations, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.client.YFUser.fileLocations, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:205)
at org.hibernate.collection.PersistentBag.add(PersistentBag.java:297)
at com.example.server.TestServiceImpl.saveFileLocation(TestServiceImpl.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:174)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Apr 2, 2010 11:33:12 PM net.sf.gilead.core.PersistentBeanManager clonePojo
INFO: Third party instance, not cloned : org.hibernate.LazyInitializationException:     failed to lazily initialize a collection of role: com.example.client.YFUser.fileLocations, no session or session was closed
هل كانت مفيدة؟

المحلول

Lazy يعني أنه يتم تحميل قيم المجموعة من قاعدة البيانات فقط عند الوصول إليها. إذا كان في ذلك الوقت Session تم إغلاقه ، LazyInitializationException يتم إلقاؤه ، لأنه لا يمكن جلب البيانات.

في حالتك ، أقترح ببساطة إضافة نوع جلب حريص على الجمعية:

@ManyToMany(cascade = CascadeType.ALL, fetchType=FetchType.EAGER)

هذا سوف تحميل fileLocations عندما يتم تحميل الكيان ولن تكون هناك حاجة إلى تحميل كسول.

الحل الشائع هو الاستخدام OpenSessionInview, ، لكنه قد لا يعمل دائمًا مع GWT ، لأن العميل بعيد ولا يمكن فتح الجلسة هناك.

لذلك سيكون لديك بعض المشاكل مع التهيئة كسول. يمكنك البحث عن الأسئلة ذات الصلة ، هناك عدد قليل - هذه و هذه علي سبيل المثال.

نصائح أخرى

هذا الاستثناء يعني أن جمعية الإلغاءات لم يتم تحميلها بعد وأنك تحاول الوصول إليها. لم يتم فتح جلسة ، ولا توجد طريقة لتحميل الارتباط. هذا هو LazyinitializationException.

تحرير: اقرأ منشور بوزو للحل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top