2017-06-17 2 views
1

Ich arbeite in diesem Film Db-Projekt für die Hochschule, wo ich eine Website basierend auf Java erstellen muss, um erweiterte Suchvorgänge in einer riesigen postgresql-Datenbank zu tun. Ich verwende keine Hibernate oder ähnliche Tools. Hier ist ein Teil des ER-Diagramm für die Datenbank:

enter image description hereGrundlegende Java MVC: Bohnen und assoziative Entitäten mit Attributen

Wie Sie sehen können, die assoziative Einheit actormovie verbindet die Einheiten Schauspieler und Film, während auch den Charakter porträtiert auflistet. Ich habe zwei einfache Beans, Actor und Movie, mit Attributen, Getter und Setter erstellt.

Dies ist mein erstes Java Web Projekt mit Fokus auf MVC, also bin ich mehr als ein bisschen verloren. Meine Frage ist: Soll ich eine Bean erstellen, die die assoziative Tabelle abbildet? Wenn nicht, was mache ich mit dem Attribut as_character?

Antwort

1

Die Antwort ist ja.
Dies ist, weil die Beziehung Actor-> Film hat eine Eigenschaft as_character, Sie können auch einen Weg finden, keine Klasse zu tun, aber in der langen Zeit wird es Probleme verursachen (vielleicht einige dumme Fehler erstellt, weil Sie es vergessen haben, oder jemand sonst wusste es nicht, etwas, mit dem du dich nicht befassen willst).
Wenn dies Ihre erste Annäherung ist, denke ich, was Sie verwirrt machen kann ist, wie man die Beziehung darstellt.
Der erste Ansatz, der in den Sinn kommen, die meiste Zeit, ist wie eine ActorMovie Klasse haben:

public class ActorMovie { 
    Integer actor_id; 
    Integer movieid; 
    String as_character; 

    //getters, setters, equals, hashCode, toString 
} 

Aber man kann auch denken an sie als Wert von Actor (oder Movie) und haben es mag:

public class ActorMovie { 
    Integer movieid; 
    String as_character; 

    //getters, setters, equals, hashCode, toString 
} 

und Actor Klasse:

public class Actor { 
    Integer actor_id; 
    String name; 
    String sex; 
    Set<ActorMovie> movies; 

    //getters, setters, equals, hashCode, toString 
} 

Beide lösen die Probleme, sie ändern nur, wie Sie mit diesen Daten durch den Code interagieren werden, um zu lernen, wann es besser ist, das eine oder das andere zu verwenden, müssen Sie beides ausprobieren und sehen, was Sie mehr fühlen "natürlich" und sehen Sie die Ergebnisse.

+0

Macht für mich Sinn. Wäre es nicht falsch, etwas Ähnliches zu haben, anstatt auf IDs zu verweisen? 'öffentliche Klasse ActorMovie { Schauspieler Schauspieler; Film; String as_character; // Getter, Setter, equals, hashCode, toString } ' – Panque

+0

Nun, ich mag es so oder so. Vielen Dank. – Panque

+0

Ja, es kann auch eine Lösung sein! Was sich ändert, wenn Sie einen 'Film' verwenden, ist derjenige, der Zugang zu einem' ActorMovie' hat, kann die Setter des Films aufrufen, also laden Sie vielleicht ein 'ActorMovie', dann können Sie etwas tun wie' actorMovie.getMovie(). SetName ("etwas anderes") '. Sie müssen berücksichtigen, wenn Sie wählen, welche Verwendung (für eine bessere Erklärung einige Suche nach dem Aggregat Design-Muster) – rascio

1

Nein, Sie brauchen nicht. Die Klasse Actor hat eine Liste von Movie und die Movie-Klasse eine Liste von Actor. Einfach so abbilden.

Zum Zeichenattribut können Sie eine Karte in der Actor-Klasse erstellen, wobei der Schlüssel der Film ist und der Wert das Zeichen (oder eine Liste von Zeichen, weil ein Darsteller viele Zeichen gleichzeitig haben kann) Film):

Map<Movie, List<String>> characters = new HashMap<>()

+0

Was ist mit dem Attribut "as_character"? – Panque

+0

Die Antwort der Bearbeitung ansehen – BrunoDM

+0

Das ist eine elegante Lösung, ich denke nur, dass es schwieriger sein wird, mit der zu arbeiten, als die, die ich akzeptiert habe, da ich ständig mit Daten von beiden Entitäten umgehen werde. Danke für die Antwort tho, ich habe definitiv gelernt, ein oder zwei Dinge zu untersuchen. – Panque

1

Es hängt davon ab, wie sich Ihr Projekt entwickelt. Sie sollten eine Bean-Zuordnung für die assoziative Tabelle erstellen, wenn Sie keine objektbezogene Zuordnung verwenden (wie Sie in der Frage angegeben haben). Wenn Sie später Object Relational Mapping einführen, kann Actor die Eigenschaft as_character besitzen. Dann sollten Sie kein Bean-Mapping für die assoziative Tabelle erstellen.

Verwandte Themen