[PP] ProblemPost
Soooo da das ja bei den Benutzern schon so wunderbar klappt, hier dann mal meine Probleme:
Wie in einem der letzten Posts erwähnt, möchte ich gerne eine Abhängigkeit meiner Entries untereinander haben. Das heißt, ich möchte unter einem Eintrag n Untereinträge haben. Das Klassendiagramm schaut dann so aus:
Meine Tabelle sieht so aus:
Ja eigentlich recht simpel. Nun bietet JPA im Rahmen von Annotation genau eine solche OneToMany Beziehung an.
@OneToMany(cascade=CascadeType.REMOVE) private List _child_entries = new Vector();
In dieser Liste würden dann alle Kinder des Eintrages stehen.
Da ich mal einfach annehme, dass es unnötig ist, auf DB Ebene noch Foreign Keys zu erstellen, hoffe ich einfach mal, dass das so laufen wird.
Weiterhin habe ich eine Relations Tabelle, die mir die Benutzter mit den Einträgen verbindet und auch sicherstellt, dass n Benutzer für einen Eintrag zuständig sein können:
Hier beginnt es nun problematisch zu werden.
Okay es gibt in dem EJB Buch eine Beschreibung wie man ManyToMany Beziehungen modelliert, allerdings habe ich hier ja auch ein Attribut “status”, welches ja an sich nichts mit der Relation zu tun hat, allerdings schon logisch von dieser Abhängt.
Es würde sich meiner Meinung nach anbieten, dieses als seperates Objekt zu machen.
Ich habe mir das erstmal durch Netbeans generieren lassen. Es ist nun zugegebenermaßen etwas sperrig (weil Netbeans eine eigene PrimaryKey Class drum generieren will, damit sichergestellt ist, dass bei Neuerstellung alle notwendigen Schlüssel belegt sind), allerdings denke ich, dass es eine hinreichende Funktionalität bietet, um erst einmal weiter zu arbeiten.
Kommen wir nun zum Highlight :-/.
Es geht darum, dass die JDBC Anbindung von MySQL seltsamerweise Schwierigkeiten mit Daten zu haben scheint. Siehe dazu auch MySQL Bug #19274.
Ich werde jetzt mal versuchen, eine aktuelle Version zu installieren, die das Problem nicht mehr haben soll. Es geht halt nur darum, dass MySQL mit leeren Datumsangaben (ala 0000-00-00 00:00:00) nichts anfangen kann und eine exception wirft. Das ist in sofern ja nicht schlimm, als das ich einfach einen Eintrag erstellt habe und dann mal hoffe, dass ich damit den Fehler vermeide.
Ich fand weiterhin eine interessante Übersicht, wie JDBC die DB Attribute nach Java überführt:
aus Sun Java System Application Server 9.1 Developer’s Guide
Zu guter Letzte suche ich eine Möglichkeit, um einen klassischen HTTP Redirect (Status 303/301 usw.) Mit der Jersey Umgebung hin bekomme. Es gibt dazu sogar eine Diskussion in dem Blog von Angry Bill unter JSR 311, JAX-RS: Comment and suggestions. Ich fände eine Lösung mit einer @Location Annotation sehr gut. Bisher fand ich nur folgende Lösung, welche ich aber bisher noch nicht ausgiebig testen konnte:
Philosophical content negotiation aus dem Blog von Paul Sandoz (da steht jede Menge zu REST und JSR311 drin)
Abschließend noch eine Bemerkung zu der letzten Diskussion über die Queries.
Im REST-Test von Sun werden u.a. die Pagination-Settings an die URL angehängt also gibt es dann in etwas folgendes als Aufruf:
Request: GET http://localhost:8080/cotodo/resources/users/start=0&max=10×tamp=1196991596495
Irgendwie schaut das schon wesentlich unübersichtlicher aus. Aber letztendlich muss ich mich eh noch damit befassen, wie ich die Parameter aus der URI extrahiere. Da ich nicht annehme, dass sich die beiden Möglichkeiten großartig unterscheiden werden, kann man sich ja direkt gleich mit der richtigen Lösung befassen.
Ein Problem was ich sehe, ist allerdings die Eindeutigkeit der Parameter, weil diese ja bei steigender Anzahl einen größeren Teil der URI bilden dürften.
Letztendlich ist es aber das gleich Problem wie bei allen Methodenaufrufen, bei denen man anhand eines Aufrufes auch nicht ohne weiteres sagen kann, wofür welcher Wert nun wirklich steht.
Abhängigkeit der Entries:
Ich habe auch eine Tabelle mit Kategorien (“fact_categories”), wovon jede Kategorie eine Unterkategorie von einer anderen sein kann und deshalb auch eine parentId (“category_id”) besitzt. Ich denke das ist so ähnlich wie du das gebaut hast.
/** Id of parentcategory */
@JoinColumn(name = “category_id”, referencedColumnName = “id”)
@ManyToOne
private FactCategory categoryId;
/** sub-categories */
@OneToMany(cascade = CascadeType.ALL, mappedBy = “categoryId”)
private Collection factCategoryCollection;
Somit habe ich fast genauso wie du, allerdings verwende ich eine Collection (Hat Netbeans so angelegt 😉 ) und die ist auch automatisch befüllt bzw wird dann befüllt, wenn ich diese abrufe mit
Collection allsubcategories = myfactcategory.getFactCategoryCollection();
(in dieser Form nicht getestet aber so müsste es gehen)
(die Methode in der Entity FactCategory ist ein stinknormaler getter. alles weitere macht jpa automatisch)
public Collection getFactCategoryCollection() {
return this.factCategoryCollection;
}
Wie man das ganze jetzt vernünftig zB in einem Baum ausgeben kann, habe ich mir noch nicht überlegt und ist auch erstmal nicht vorgesehen
PS: Sehr nützliche Tabelle (supported data types), wo haste die gefunden? Immer schön Quellen angeben 😉
PPS: Womit hast du das Klassendiagramm erstellt?