LazyInitializationException quando si aggiunge a un elenco che si svolge all'interno di una classe entità utilizzando hibernate e Gilead per GWT
Domanda
A destra in modo che io sto lavorando con Hibernate Galaad e GWT a persistere i miei dati sugli utenti e file di un sito web. i miei utenti hanno un elenco di percorsi di file. Sto usando le annotazioni per mappare le mie classi al database. Sto ottenendo un org.hibernate.LazyInitializationException
quando provo ad aggiungere posizioni dei file alla lista che si tiene nella classe utente.
questo è un metodo di sotto che viene sovrascritto da un upload di file di classe servlet esterno che sto usando. quando il file carica si chiama questo metodo.
dell'utente1 viene caricato dal altrove database.
l'eccezione si verifica in user1.getFileLocations().add(fileLocation);
. Non capisco davvero a tutti.! Qualsiasi aiuto sarebbe grande. l'analisi dello stack dell'errore è inferiore a
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;
}
// Questo è il file di classe per un i file utente
@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
Soluzione
pigri significa che i valori della collezione vengono caricati dal database solo quando vi si accede. Se in quel momento il Session
è stato chiuso, il LazyInitializationException
è gettato, perché i dati non possono essere recuperati.
Nel tuo caso mi piacerebbe semplicemente suggerisco di aggiungere un ansioso tipo di recupero su l'associazione:
@ManyToMany(cascade = CascadeType.ALL, fetchType=FetchType.EAGER)
Questo caricherà il fileLocations
quando l'entità viene caricato e non sarà necessaria caricamento lazy.
Una soluzione comune è quello di utilizzare OpenSessionInView , ma non sempre il lavoro con GWT, becaucse il client è remoto e la sessione non può essere aperto lì.
Quindi, si sta andando ad avere alcuni problemi con l'inizializzazione pigra. È possibile cercare in giro per le domande relative, ci sono pochi - questo e questo per esempio.
Altri suggerimenti
Questo significa che l'associazione di eccezione FileLocations non è ancora caricato e si sta tentando di accedervi. Non v'è alcuna sessione aperta, e non v'è alcun modo per caricare l'associazione. Questo è il LazyInitializationException.
Modifica:. Post LEGGI Bozho di per la soluzione