hmm ich habe mal ein wenig in dem JSR gelesen was eigentlich so verlangt wird. Programmieren wir nicht irgendwie an irgendwas herum? getSingleResult ist eine Zeile als Obejct es geht alles um EJB also muss man nicht nur seine *eigene Query language* schreiben sondern auch irgendwie alles managen, es ist aber nicht wirklich gans so das, was ich haben will es fehlt auch in dieser JSP etwas was ich haben will, wir Observer Pattern ja, ist schon was feines aber es kann nur gehen wenn Objecte niemals Detatched werden. LOCK von Objecten ist naja von der Datenbank zu machen *das scrollen in einem Resultset auch* nunja worüber man sich streiten kann ist das eine verbindung nicht ewig hält, und ein nutzer wissen solte, ob er Lesend oder schreibend diese objekte nutzen will, oder dass man ihm dennoch eine schreibende methode gibt die alle Objekte in die datenbank schreibt/updatet eine Konfiguration von Objekten selber finde ich auch recht überflüssig ist es nicht einfacher, wenn wir davon ausgehen, dass jedes Object was wir in unsere schnittstelle geschoben bekommen für/von der datenbank ist. ein weiteres problem sehe ich in welches object in welche datenbank , .... ... :::TODO::: es ist doch einfacher wenn ich in meiner anwendung mit meinen beans nichts konfigurieren muss, ich will ableitungen in der datenbank speichern ja, aber doch nicht mit hunderten von annotationen den kram erreichen, ist es so schwer eine wenig KI ins spiel zu bringen, wenn ein Object abgeleitet ist und es eine tabelle gibt, oder die spalten der felder der super klasse vorhanden sind in meiner tabelle, diese zu setzen? das was ich für sinvoller halte ist eine annotation zu definieren, die alles was nicht zur datenbank gehört zu markieren, nicht was aus der datenbank ist, ich kann alle felder lessen, alle methoden, alle super klassen finden, dessen methoden und felder wieso muss ich dann sagen dass wenn ich eine Liste als feldtyp angegeben habe dass es ein 1-n n-m oder was auch immer ist, wenn ich eine liste angebe und sage @NotAtDatabase angebe weiß ich dach dass es nicht aus der datenbank kommt, und ansonsten weiß ich, dass es eine Liste geben muss vom Type T da wir Generics verwenden!! ich geben mal wieder später meinen SENF dazu.
Soll eine Bibliothek für eine "Java Persistenz API" werden, die flach und einfach ist,
Es kann losgehen, ich brauche nun eine Abstraktion, für mich privat (Homepage) und für ein paar Freunde. (JensKapitza)
Nach einer Besprechung beim LUG-Treffen wollten wir dieses Thema mal wieder aufwärmen.
| JPApi.Lizenz | GPL. (U.u. BSD, LGPL) |
| Projektname | JProxyApi, SwingingBeans |
| SVN | http://svn.bayen.mine.nu/svn/tbayen/trunk/SwingingBeans/![]() |
| Entwickler | JensKapitza, ThomasBayen,wer noch? |
| OpenJPA | hmm muss man sich mal näher angucken |
| Probleme | Lösung |
|---|---|
| UTF-8, ich bin doch ISO nutzer ;) Umlaute sind schön! | Ist im Projekt jetzt fest eingestellt, bitte updaten |
Also den Projektnamen JPApi nehme ich nicht. Der ist ja hässlich. Da werden wir im Limericks nochmal das eine oder andere Guinness drüberlaufen lassen müssen. :-) Ein öffentliches SVN habe ich bei mir. Wenn das Projekt in Fahrt kommt, können wir es auch nach Sourceforge transferieren (in lug-kr oder einem eigenen Projekt).
-- ThomasBayen
-- ThomasBayen
) #
- Bytecode-Manipulation, wird von vielen bekannten Projekten genutzt
- Alternative zu BCEL
- Bytecode-Assembler
- aspektorierentiertes Java
- Lösung aus dem JDK
einfach einen Compiler aufrufen?) (siehe auch Dynamic Java Compiler
)
gehen. -PeterHormanns
könnte man zur Compile-Zeit erweiterte Klassen erzeugen (benutzt SERP)
Da ja leider in Java kein Java-Compiler enthalten ist, aber in Java6 Rhino (Javascript Engine) enthalten ist, ist das vielleicht die richtige Sprache. Java als Sprache hätte den Vorteil, daß die o.g. angepassten Observer ganz normal in den Sourcecodebaum kommen könnten.
Ein Kriterium könnte noch sein, ob es unter JavaWebStart ohne weitere Sicherheitsfreigabe lauffähig ist (wäre bei Java einfach, bei Rhino müsste man das mal testen).
Ach ja - meine BCEL-Lösung ist eine Ableitung der Beanklasse, um die es geht, die ein besonderes Interface implementiert. Hibernate hingegen benutzt Proxy-Objekte. Mir ist der Sinn der Proxy-Lösung noch nicht aufgefallen. Im Gegenteil haben die persistenten Objekte dann ja eine komplett andere Klasse. Kennt jemand ein Argument für Proxys?
Problem mit der Umwandlung der Objektklasse
Ich habe ein Problem gefunden, das ich spontan nicht lösen kann. Laut JPA kann man ein Objekt mit
Player p = new Player();
erzeugen und dann mit
EntityManager em = ... em.persist(p);
persistent machen. Das verstehe ich nicht ganz. Vorher ist p ja wohl einwandfrei ein ganz normales Player-Objekt ohne irgendwelche Besonderheiten. Nach dem persist-Aufruf müsste es doch dann ein persistentes Spezialobjekt (also eine Ableitung, ein Proxy oder sowas) sein. Wie kann denn die Methode em.persist die Klasse von p verändern?!?
Vielleicht ist es langsam an der Zeit, einige Threads zusammenzufassen und ein paar grundlegende Entscheidungen zu treffen:
Wie werden Observer in die Klassenstruktur eingebaut?
Was benutzen wir zur Erzeugung von Observern?
Hier möchte ich kontroverse Dinge sammeln bzw. Entscheidungen dokumentieren, die nicht sofort offensichtlich sind.
Eine Möglichkeit ist es, unabhängige Beans (mit Fremdschlüsseln ggf. einen Beanbaum) zu laden. Diese werden dann frei bearbeitet und werden mit einer update-Methode wieder zurückgeschrieben. Das andere Extrem ist es, wenn jeder getter und setter der Bean direkt auf einen SQL-Befehl gemappt wird. Zwischenlösungen sind denkbar. Für verschiedene Probleme sind verschiedene Bindungsstärken sinnvoll. Was sollte nun wirklich implementiert werden?
Nach Lesen der JPA-Spezifikation habe ich bemerkt, daß das ein Problem der Datenbank-Transaktion ist. In einer JavaEE-Umgebung ist das ganze wohl egal, in JavaSE sollte man entweder eine Möglichkeit haben, die Transaktion auf "autocommit" zu stellen, oder in der GUI darauf achten, daß nach jedem Klick brav committet wird. Was besser ist, bin ich noch unentschlossen.
Eine Klasse mit gettern und settern, um auf bestimmte Eigenschaften zuzugreifen. Beispiel:
public class Bean {
private Feld a;
public Feld getA() { return a; }
public setA(Feld b) { a = b; }
}
Ich denke, wir sollten damit anfangen, die Teile der JPA-Spezifikation (JSR 220 lesen!) zu implementieren, die wir für unsere konkreten Anwendungen benötigen.
Sind wir schon soweit, daß wir eine grobe Klassenstruktur angeben können und dann vielleicht auch schon Aufgaben verteilen? Im Moment fällt es mir noch schwer, das Problem zu fassen und in zwei oder mehr Teile zu zerlegen.
Jens schlug vor, als Basis einer Collection das ResultSet zu nehmen. Leider steht - wie ich vermutete - in der ResultSet API
, daß die Methoden zur Navigation in ResultSets eine SQLFeatureNotSupportedException werfen dürfen, wenn sie vom JDBC-Treiber nicht unterstützt werden.
Apropos cachen sinnvoll: Es bleibt der Unterschied, daß ein ResultSet IMO seinen Inhalt nicht ändert, ein Query bei jedem Zugriff anders aussehen kann. Beides kann sinnvoll sein. Was passiert denn mit einem ResultSet, wenn die Transaktion abgeschlossen ist? Wenn man das RS-Objekt stundenlang behält, hat man dann immer noch Zugriff auf alle alten Daten?!? Ist das irgendwo spezifiziert? -- ThomasBayen
oder PBeans
scheinen mir ein leichtgewichtiger Ansatz, wenn es nicht Hibernate oder JPA sein soll... --PeterHormanns