2010-04-02 1 views
1

Droit donc je travaille avec hibernate gilead et gwt pour persister mes données sur les utilisateurs et les fichiers d'un site Web. mes utilisateurs ont une liste d'emplacements de fichiers. J'utilise des annotations pour mapper mes classes à la base de données. J'obtiens un org.hibernate.LazyInitializationException quand j'essaye d'ajouter des emplacements de fichier à la liste qui est tenue dans la classe d'utilisateur.LazyInitializationException lors de l'ajout à une liste qui est détenue dans une classe d'entité en utilisant hibernate et gilead pour gwt

Cette méthode ci-dessous est remplacée par une classe de servlet de téléchargement de fichier externe que j'utilise. lorsque le fichier le télécharge appelle cette méthode.

l'utilisateur1 est chargé depuis la base de données ailleurs. l'exception se produit à user1.getFileLocations().add(fileLocation);. Je ne comprends pas vraiment du tout.! Toute aide est la bienvenue. la trace de la pile de l'erreur est inférieure à

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; 
    } 

// Ceci est le fichier de classe pour vos fichiers utilisateur

@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 

Répondre

3

Lazy signifie que les valeurs de la collection sont chargées en om la base de données seulement quand ils sont accédés. Si à ce moment le Session a été fermé, le LazyInitializationException est lancé, car les données ne peuvent pas être récupérées.

Dans votre cas, je voudrais simplement vous suggérons d'ajouter un type chercher désireux de l'association:

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

Cela va charger le fileLocations lorsque l'entité est chargée et aucun chargement paresseux sera nécessaire.

Une solution courante consiste à utiliser OpenSessionInView, mais cela peut ne pas toujours fonctionner avec GWT, car le client est distant et la session ne peut pas être ouverte là.

Vous allez donc avoir quelques problèmes avec l'initialisation paresseuse. Vous pouvez rechercher autour de questions connexes, il y en a quelques-uns - this et this par exemple.

+0

acclamations dude .. très utile – molleman

+1

vous avez raison à propos de l'exception, mais notez que le chargement hâtif pourrait masquer son problème comme suit: 1. Il doit encore synchroniser (fusionner) cet utilisateur avec une session pour avoir son nouveau fileLocations persisté . 2. Le cas d'utilisation courant de Gilead est de remplacer les proxies non initialisés par NULL, de sorte que vous n'obtiendrez pas de telles exceptions. Je pense que l'OP pourrait être un peu confus au sujet de son implémentation de Gilead car toutes les méthodes ILightEntity sont de l'implémentation automatique d'eclipse (c'est-à-dire non implémentées). – Ittai

0

Cette exception signifie que l'association FileLocations n'est pas encore chargée et que vous essayez d'y accéder. Il n'y a aucune session ouverte, et il n'y a aucun moyen de charger l'association. Ceci est l'exception LazyInitializationException.

Modifier: Lire le post de Bozho pour la solution.

Questions connexes