2010-01-09 10 views
6

Ich arbeite an einer API für den Zugriff auf Daten in einem System gespeichert. Das System enthält Dinge wie Personen, Termine und Verfahren, die diesen Terminen zugeordnet sind. Meine Bewerbung wird ausschließlich schreibgeschützt sein.POJO mit anderen POJO Referenzen

Ich benutze Spring w/RowMapper, um Objekte wie "Person", "Appointment" und "Procedure" zu bauen. Ich habe ein DAO für jedes Element. (zB: PersonDAO.getById(), PersonDAO.getByName(), ..).

Das Problem kommt in Appointment hat einen Verweis auf ein Person Objekt. Es wäre schön, in dem Person Objekt einen Verweis auf die Person Termine zu haben, aber wenn ich beginne, diese zu laden, wird es eine zirkuläre Referenz.

Also, ich denke, meine Frage ist der richtige Weg, damit umzugehen, nur die Referenzen (Ids) in den POJOs setzen und dann die Business-Schicht (?) Nur die richtigen Anrufe machen, um die Informationen zu bekommen? Oder ist es in Ordnung, irgendwie einen Verweis auf das DAO im POJO zu übergeben, damit ich die Objektobjekte beim Referenzieren träge laden kann? Aber wie gehst du dann mit der Zirkelreferenz um? Wenn ich eine Person und ich träge alle ihre Termine laden, diese Termine haben auch eine Person mit ihnen verbunden. Wenn ich dieses Person lade, könnte es möglicherweise unterschiedliche Informationen von der Person haben, die ich Termine für lade.

Person (Objekt x) träge laden -> Termine könnten Person (Objekt x ') laden.

Seit Person könnte sich zu der Zeit geändert haben, ich ging, um ihre Termine faul laden. Ich brauche wirklich das Person Objekt in Appointment, um auf dasselbe Person Objekt zu verweisen.

Ich bin alle davon gefangen. Ich weiß, ich könnte einfach "es zum Laufen bringen", aber ich möchte versuchen, eine gute Lösung zu finden. Ich habe darüber nachgedacht, Hibernate zu verwenden, dachte aber, dass es wirklich nur Overkill war. Vielleicht ist es nicht.

Antwort

2

Sie beschreiben eine bidirektionale Assoziation, für die Hibernate spezifische (und im Allgemeinen sehr gute) Unterstützung bietet.

Gelesen auf how to do it in den Dokumenten.

Rollen von Hand wird ziemlich fummelig und fehleranfällig sein. Ich würde es nicht empfehlen. Nutzen Sie die Möglichkeiten von ORM-Tools wie Hibernate, dafür sind sie da.

+1

Wie das Wort "knifflig". – BalusC

+0

Sie können es jederzeit gerne verwenden :) – skaffman

+0

Danke. Ich werde es mir ansehen. Ich muss nur die Zeit verbringen, um in den Winterschlaf zu gehen. –

0

Erweitern Sie den Vorschlag, Hibernate zu verwenden, würde ich empfehlen, die JPA-Annotation-Unterstützung, die Hibernate unterstützt, zu überprüfen (ich glaube, dass es Teil der J2EE-Spezifikation ist). Sie können Ihre Klassen mit einer Annotation @ManyToMany annotieren. Schauen Sie sich diese Dokumente:

https://www.hibernate.org/397.html

+0

'@ ManyToMany' hat eigentlich nichts mit bidirektionalen Assoziationen zu tun. Es ist ein orthogonales Konzept. – skaffman

+1

Sie haben Recht. Ich habe es in seinem konkreten Fall zur Klarheit dargelegt. Ich dachte, dass in dem Modell von Person und Verabredung viele Menschen zu einem Termin gehören könnten, eine Person könnte viele Termine haben. In diesem Fall würden Sie @ManyToMany auf der einen Hälfte der bidirektionalen Beziehung und @MappedBy auf der anderen Seite verwenden. Hoffe das klärt die Dinge auf. –

+0

Eigentlich in meinem speziellen Fall. Einem Termin ist nur eine Person zugeordnet, aber eine Person kann mehrere Termine haben. –