Hallo
Ich entwickle ein kleines Projekt in NetBeans.
Ich benutze toplink um die derby DB zu handlen. Mittels einer Bean im ejb projekt füge ich in der tabelle "Modules" ein modul hinzu welches als fremdschlüssel einen "Teacher" benötigt (createModule(...) ). Eine andere Methode (getModules(...) ) dieser Bean soll dann alle Module eines Teacher in einer Collection zurückliefern. Das funktioniert aber nicht - es werden alle bestehenden Module ausser des neu hinzugefügten zurückgeliefert. Die Module bestehen aber in der DB und nach einem Projektneustart werden sie auch zurückgeliefert.
Kann mir da jemand weiterhelfen?
Achja: glaube nicht, dass das eine Rolle spielt, aber ich greife über Servlets auf die Bean zu.
Code:
@Entity
@Table(name = "TEACHER")
@NamedQueries(...)
public class Teacher implements Serializable, UniversityMember {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEACHER_ID", nullable = false)
private Integer teacherId;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "PW", nullable = false)
private String pw;
@OneToMany(mappedBy = "fkTeacher", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private Collection<Modules> modulesCollection;
//getter und setter methoden
}
@Entity
@Table(name = "MODULES")
@NamedQueries(...)
public class Modules implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MODULE_ID", nullable = false)
private Integer moduleId;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "DESCRIPTION")
private String description;
@JoinColumn(name = "FK_TEACHER", referencedColumnName = "TEACHER_ID")
@ManyToOne
private Teacher fkTeacher;
//getter und setter methoden
}
@Stateless
public class ChooseModulesBean implements ChooseModulesLocal {
@PersistenceContext
private EntityManager em;
public void createModule(String name, String description, int fkTeacher) throws ChooseModulesException {
try{
Modules module = null;
Teacher teacher = em.find(Teacher.class, fkTeacher);
module = new Modules(name);
module.setFkTeacher(teacher);
if(description.length()>0){
module.setDescription(description);
}
em.persist(module);
em.flush();
}catch(Exception e){
throw new ChooseModulesException("module could not be created." + e.getMessage());
}
}
public Collection<Modules> getModules(Teacher teacher) throws ChooseModulesException{
try{
em.flush();
Teacher teacherManaged = em.merge(teacher);
//in diesem Moment besteht das Modul schon in der DB, die Collection enthält das neu hinzugefügt Modul aber nicht
Collection<Modules> modules = teacherManaged.getModulesCollection();
Iterator iM = modules.iterator();
Modules m = null;
while(iM.hasNext()){
m = (Modules) iM.next();
}
return teacherManaged.getModulesCollection();
}catch(Exception e){
throw new ChooseModulesException("modulecollection not be returned" + e.getMessage());
}
}
}
Ich entwickle ein kleines Projekt in NetBeans.
Ich benutze toplink um die derby DB zu handlen. Mittels einer Bean im ejb projekt füge ich in der tabelle "Modules" ein modul hinzu welches als fremdschlüssel einen "Teacher" benötigt (createModule(...) ). Eine andere Methode (getModules(...) ) dieser Bean soll dann alle Module eines Teacher in einer Collection zurückliefern. Das funktioniert aber nicht - es werden alle bestehenden Module ausser des neu hinzugefügten zurückgeliefert. Die Module bestehen aber in der DB und nach einem Projektneustart werden sie auch zurückgeliefert.
Kann mir da jemand weiterhelfen?
Achja: glaube nicht, dass das eine Rolle spielt, aber ich greife über Servlets auf die Bean zu.
Code:
@Entity
@Table(name = "TEACHER")
@NamedQueries(...)
public class Teacher implements Serializable, UniversityMember {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEACHER_ID", nullable = false)
private Integer teacherId;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "PW", nullable = false)
private String pw;
@OneToMany(mappedBy = "fkTeacher", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private Collection<Modules> modulesCollection;
//getter und setter methoden
}
@Entity
@Table(name = "MODULES")
@NamedQueries(...)
public class Modules implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MODULE_ID", nullable = false)
private Integer moduleId;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "DESCRIPTION")
private String description;
@JoinColumn(name = "FK_TEACHER", referencedColumnName = "TEACHER_ID")
@ManyToOne
private Teacher fkTeacher;
//getter und setter methoden
}
@Stateless
public class ChooseModulesBean implements ChooseModulesLocal {
@PersistenceContext
private EntityManager em;
public void createModule(String name, String description, int fkTeacher) throws ChooseModulesException {
try{
Modules module = null;
Teacher teacher = em.find(Teacher.class, fkTeacher);
module = new Modules(name);
module.setFkTeacher(teacher);
if(description.length()>0){
module.setDescription(description);
}
em.persist(module);
em.flush();
}catch(Exception e){
throw new ChooseModulesException("module could not be created." + e.getMessage());
}
}
public Collection<Modules> getModules(Teacher teacher) throws ChooseModulesException{
try{
em.flush();
Teacher teacherManaged = em.merge(teacher);
//in diesem Moment besteht das Modul schon in der DB, die Collection enthält das neu hinzugefügt Modul aber nicht
Collection<Modules> modules = teacherManaged.getModulesCollection();
Iterator iM = modules.iterator();
Modules m = null;
while(iM.hasNext()){
m = (Modules) iM.next();
}
return teacherManaged.getModulesCollection();
}catch(Exception e){
throw new ChooseModulesException("modulecollection not be returned" + e.getMessage());
}
}
}