2010-12-06 4 views
0

Ich habe zwei Entities, Person und Teacher mit OneToMany Beziehung:Wie erzwinge TopLink, OneToMany-Beziehung sofort einzurichten?

public class Person implements Serializable { 
    @Id 
    @Column(nullable = false) 
    private String login; 
    @OneToMany(mappedBy = "person") 
    private List<Teacher> teacherList; 
} 

public class Teacher implements Serializable { 
    @ManyToOne 
    @JoinColumn(name = "LOGIN") 
    private Person person; 
} 

ich auch eine DTO-Klasse für Person haben:

public class PersonDTO extends Person { 
    private boolean isTeacher; 

    public PersonDTO(Person p) { 
     setLogin(p.getLogin()); 
     isTeacher = getTeacherList().size() > 0; 
    } 

    public boolean isTeacher() { 
     return isTeacher; 
    } 
} 

Mein EJB Code wie diesen hat neue Teacher s zum Einfügen und lesen Person s:

public void addTeacher(String login, String password, String name, 
         String dept, String title) { 
    p = new Person(true, false, login, name, password); 
    persistEntity(p); 
    Teacher t = new Teacher(dept, p, title); 
    persistEntity(t); 
    em.flush(); // 'em' is the Entity Manager 
} 

public PersonDTO readPerson(String login) { 
    Person p = em.find(Person.class, login); 
    PersonDTO pdto = new PersonDTO(p); 
    return pdto; 
} 

Auf meiner Homepage gibt es eine Tabelle, die alle Lehrer, Textfelder für die verschiedenen Felder zeigt, und eine Schaltfläche, um einen neuen Lehrer zu addieren und die Tabelle zu aktualisieren, für die der Hörer wie folgt aussieht:

public void addTeacherListener(ActionEvent actionEvent) { 
    adminManager.addTeacher(/* parameters */); 

    // update table (which is bound to 'teacherList') 
    teacherList = new LinkedList<Teacher>(); 
    List<String> logins = adminManager.findAllPerson(); 
    for (String login : logins) { 
     PersonDTO pdto = adminManager.readPerson(login); 
     if (pdto.isTeacher()) { 
      teacherList.add(pdto.getTeacherList().get(0)); 
     } 
    } 
} 

Das Problem ist, dass nach Wenn Sie einen neuen Teacher einfügen, wird er nicht in der Tabelle angezeigt. Der genaue Grund hierfür ist, dass das PersonDTO Objekt, das von readPerson zurückgegeben wird, isTeacher auf false gesetzt hat: was bedeutet, dass zum Zeitpunkt der Erstellung des DTO-Objekts (dh nach Abschluss der Einfügeoperation einschließlich der zwei Persisten und der Flush am Ende)), das Person Objekt für den gegebenen Lehrer hat eine leere teacherList.

Wenn ich jedoch die Seite schließen und von der IDE neu starten, werden die neu eingefügten Elemente in der Tabelle angezeigt. Offenbar baut TopLink die Beziehung auf, aber nicht sofort. Was genau passiert und wie kann ich es sofort nach der Insertion erzwingen?

Antwort

1

JPA behält keine konsistenten bidirektionalen Beziehungen zwischen Objekten im Speicher automatisch bei, es ist Ihre eigene Aufgabe.

Das heißt, nach addTeacher() Ausführung haben Sie eine Teacher mit person Eigenschaft auf den Person zeigen. Diese Beziehung wird in der Datenbank widergespiegelt, aber sie spiegelt sich nicht in teacherList der Person wider, die bereits im Speicher vorhanden ist. em.find() gibt die vorhandene Instanz Person aus dem Persistenzkontext zurück, so dass teacherList iempty ist.

Daher müssen Sie Teacher in Person.teacherList in addTeacher() hinzufügen.