Ciao a tutti,
ho un problema con il mio progetto in J2EE, allora vi riporto i 2 EntityBean di interesse
ENTITY TRAINER
codice:
package com.lesson.entities;
//Import
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
//Relational imports
import javax.persistence.OneToMany;
//Other imports
import java.util.List;
@SuppressWarnings("serial")
@Entity
@Table(name="trainer")
public class Trainer implements Serializable
{
//Variables
private int trainerID;
private String name;
private String surname;
private String email;
private String password;
private List<Course> taughtCourseList;
private List<Notification> unreadNotificationList;
//Getters and Setters
@Id
public int getTrainerID()
{
return trainerID;
}
........
........
ENTITY COURSE
codice:
package com.lesson.entities;
//Import
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
//Relational imports
import javax.persistence.ManyToOne;
//import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
//Other imports
import java.util.List;
@SuppressWarnings("serial")
@Entity
@Table(name="course")
public class Course implements Serializable
{
//Variables
private int courseID;
private String title;
private String field;
private Trainer trainer;
private List<Student> registeredStudentList;
private List<Material> courseMaterialList;
private List<Test> courseTestList;
//Getters and Setters
@Id
public int getCourseID()
{
return courseID;
}
.......
.......
Allora quando il client vuole creare un nuove Professore, utilizza il seguente metodo:
codice:
package com.lesson.controllers;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import com.lesson.entities.*;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.jboss.ejb3.annotation.RemoteBinding;
@Stateless
@RemoteBinding(jndiBinding="TrainerManagerRemote")
public class TrainerManagerBean implements TrainerManagerRemote
{
@PersistenceContext(unitName="lesson")
private EntityManager manager;
@EJB
private CourseManagerLocal cml;
public boolean createTrainer(TrainerRequest ntr) throws Exception
{
if (ntr.getEmail() == null || ntr.getName() == null || ntr.getPassword() == null ||
ntr.getSurname() == null || ntr.getTrainerID() <= 0)
throw new IllegalArgumentException("Invalid null fields in patientRequest");
//Check if trainer is already into DB
Query q = manager.createQuery("select t from Trainer as t where t.trainerID = ?1");
q.setParameter(1, ntr.getTrainerID());
Trainer t = null;
try
{
t = (Trainer)q.getSingleResult();
if (t != null ) throw new NonUniqueResultException("Trainer "+ ntr.getTrainerID() +"already present in DB");
} catch(NoResultException ex) {}
t = new Trainer();
t.setTrainerID(ntr.getTrainerID());
t.setName(ntr.getName());
t.setSurname(ntr.getSurname());
t.setEmail(ntr.getEmail());
t.setPassword(ntr.getPassword());
List<Course> courseList = new ArrayList<Course>();
t.setTaughtCourseList(courseList);
List<Notification> notificationList = new ArrayList<Notification>();
t.setUnreadNotificationList(notificationList);
manager.persist(t);
return true;
}
Considerate pure il "TrainerRequest come se fosse un oggetto di tipo Trainer...
Ora viene il problema:
Mettiamo che venga registrato un nuovo corso tenuto dal professore appena creato. Come posso fare per inserire nella List<Course> presente nell'entity Trainer (professore) il nuovo corso da lui insegnato?
Inizialmente ho pensato di modificare quella lista all'atto della creazione di un nuovo corso, quindi dal SessionBean di Course tramite:
codice:
public void setCourse(CourseRequest courseRequest) throws Exception
{
Course c = new Course();
c.setCourseID(courseRequest.getCourseID());
c.setCourseMaterialList(null);
c.setCourseTestList(null);
c.setField(courseRequest.getField());
c.setRegisteredStudentList(null);
c.setTitle(courseRequest.getTitle());
// Retrieve PatientManager
TrainerManagerRemote tmr;
try
{
InitialContext ctx = new InitialContext();
tmr = (TrainerManagerRemote) ctx.lookup("TrainerManagerRemote");
}
catch(Exception ne)
{
ne.printStackTrace();
throw new Exception("Cannot instantiate Trainer Manager", ne);
}
Trainer trainer = tmr.getTrainerData(courseRequest.getTrainerID());
if(trainer == null) throw new Exception("Trainier with id=" + courseRequest.getTrainerID() + " does not exist");
c.setTrainer(trainer);
manager.persist(c);
List<Course> temp = new ArrayList<Course>();
temp.add(c);
trainer.setTaughtCourseList(temp);
tmr.updateTrainer(trainer);
}
L'esecuzione non sembra generare eccezioni...tuttavia quando dal client cerco di accedere alla lista sopra citata ottengo...
codice:
IWAV0055I Java Bean lesson.client.Main started with the main method
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lesson.entities.Trainer.taughtCourseList, 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.readSize(AbstractPersistentCollection.java:119)
at org.hibernate.collection.PersistentBag.size(PersistentBag.java:248)
at lesson.client.Main.getTrainer(Main.java:116)
at lesson.client.Main.main(Main.java:31)
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 org.eclipse.ve.internal.java.vce.launcher.remotevm.JavaBeansLauncher.main(JavaBeansLauncher.java:79)
Il Client è il seguente, il metodo che uso per leggere i dati di un Trainer è getTrainerData(...), il quale generà però l'errore sopra riportato.
codice:
package lesson.client;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.lesson.controllers.*;
import com.lesson.entities.*;
public class Main
{
static TrainerManagerRemote pm;
public static void main(String[] args)
{
try
{
Context jndiContext = null;
jndiContext = getInitialContext();
Object ref = jndiContext.lookup("TrainerManagerRemote");
pm = (TrainerManagerRemote)ref;
//logIn();
//createTrainer();
//createCourse();
//updateTrainer();
getTrainer();
} catch (Exception e) { e.printStackTrace();}
}
public static void logIn()
{
try
{
if(pm.logIn(11111, "111111"))
System.out.println("[DEBUG]--Logged");
else
System.out.println("[DEBUG]--Not Logged");
} catch (Exception e) {}
}
public static void updateTrainer()
{
Trainer t = new Trainer();
t.setEmail("cristianmandelli@gmai.com");
t.setName("Cristian");
t.setSurname("Mandelli");
t.setPassword("02041985");
t.setTrainerID(1111);
t.setUnreadNotificationList(null);
List<Course> list = new ArrayList<Course>();
list.add(pm.getCourseData(1234));
t.setTaughtCourseList(list);
try
{
pm.updateTrainer(t);
} catch (Exception e)
{
e.printStackTrace();
}
}
public static void createTrainer()
{
TrainerRequest t = new TrainerRequest(2222, "Deborah", "Zamponi", "deborah.zamponi@gmail.com", "110585");
try
{
if(pm.createTrainer(t))
System.out.println("[DEBUG]--Trainer created");
} catch (Exception ex)
{
ex.printStackTrace();
}
}
public static void createCourse()
{
CourseRequest c = new CourseRequest(1234, "SoftwareEngeneering 1", "Computer Science", 2222);
try
{
if(pm.createCourse(c));
System.out.println("[DEBUG]--Course created");
} catch (Exception ex)
{
ex.printStackTrace();
}
}
public static void getTrainer()
{
Trainer t = null;
try
{
t = pm.getTrainerData(2222);
} catch (Exception ex)
{
ex.printStackTrace();
}
if(t != null)
{
System.out.println("Courses List:" + t.getTaughtCourseList().size());
}
}
static public Context getInitialContext() throws Exception
{
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"localhost:1099");
return new InitialContext(env);
}
}
qualche suggerimento circa dove sia il mio errore??
Cristian