Persistenzframework (XML/DBMS) gesucht

AceTheFace

Mitglied
Hallo,

ich bin gerade an der Planung für die Persistenzschicht einer pluginbasierten Anwendung.

Folgende Anforderungen sollten erfüllt sein:
  • (einfache) Möglichkeit zum Umschalten zwischen XML-basiert und Datenbankbasiert
  • Keine globale Config-Datei (da pluginbasierte Anwendung weiss ich vorher nicht welche Plugins existieren und kann somit vorher keine globale Config-Datei erstellen welche Mappings existieren)
  • möglichst Abstrakt, so dass ich bei Änderung des Speicherformats (XML/DB) die Plugins am besten nicht ändern muss (am liebsten würde ich einfach nur gerne myClass.store() aufrufen und gut ist, also keine sql-statements oder file-writer-jongliererei innerhalb der plugins)

Ich habe mir bisher die Frameworks von http://java-source.net/open-source/persistence angeschaut. Doch leider war soweit ich es gesehen habe nichts passendes dabei. Bei Hibernate habe ich v.a. das Problem mit der globalen Konfigurationsdatei, die ich halt erst füllen könnte nachdem meine Plugins geladen wurden. Ausserdem bin ich mir nicht sicher ob man bei Hibernate auch auf XML-Basis arbeiten kann.

Wäre nett wenn mir jemand einen Tipp hat. Vielleicht sind meine Wünsche ja auch einfach zu speziell oder unrealistisch. Auch dann wäre ein Hinweis nett, dann schraube ich die Anforderungen zurück :)

Vielen dank, Gruß,
Ace
 
Zuletzt bearbeitet:
Hallo,

Bei Hibernate habe ich v.a. das Problem mit der globalen Konfigurationsdatei, die ich halt erst füllen könnte nachdem meine Plugins geladen wurden.
Das ist mit einer entsprechenden Systemarchitektur kein Problem wenn du ein statisches Plugin System hast (Plugins werden nur beim starten geladen, um neue Plugins zu aktivieren muss man die Anwendung neu starten) dann kannst du beispielsweise dein Mapping einmal beim Starten über alle Plugins aufbauen.
So ähnlich hab ich das hier gemacht:
http://www.tutorials.de/forum/java/...ate-equinox-osgi-eclipse-extensionpoints.html

Wenn du ein dynamisches Plugin System hast (Plugins können zur Laufzeit geladen und wieder entladen werden), dann wirds etwas komplizierter . Dann musst du deine Systemarchitektur darauf hin auslegen, dass die Hibernate Laufzeit dynamisch neu initialisiert werden kann (um die neuen Mappings zu erfassen). Das ist aber auch kein Problem...

Ausserdem bin ich mir nicht sicher ob man bei Hibernate auch auf XML-Basis arbeiten kann.
Hibernate kann auch mit XML Datenbanken arbeiten:
http://www.devx.com/Java/Article/27896/1954?pf=true

Gruß Tom
 

Hm, da sind für mich ziemlich viele böhmische Dörfer drin *g* Muss ich mir mal genauer zu Gemüte führen was du da gemacht hast.


Darauf bin ich beim Googlen auch gestoßen. Allerdings hat mich dieser Satz etwas irritiert: "With Hibernate 3, Java application developers can conveniently persist XML documents into relational databases." Für mich klingt das so, als habe ich nun einfach die Möglichkeit meine Basisdaten, die in XML vorliegen, über Hibernate in einer rel. DB zu speichern.

Gruß,
Ace
 
So,

ich habe mich jetzt einfach mal für Hibernate entschieden. Die Sache mit den Extension Points von Eclipse habe ich aber nicht wirklich verstanden. Deshalb habe ich jetzt einfach mal angefangen es ohne zu probieren. Ziel ist es Hibernate in Verbindung mit einem statischen Pluginsystem (handelt sich um eine Servletbasierte Anwendung, so dass die Plugins beim deployen bereits bekannt sind) zu verwenden.

Ich habe hier nun mal meinen PersistenceManager, den die einzelnen Plugins benutzen können:

Java:
public class PersistenceManager {
    
    private SessionFactory factory;
    private PluginRegistry registry;
    private List<PersistentObject> objects; 
    
    public PersistenceManager() {
        loadPersistentClasses();
        configure();
    }
    
    public void configure() throws HibernateException {
        Configuration config = new Configuration().
            setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").
            setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver").
            setProperty("hibernate.connection.url", "jdbc:mysql://localhost/portalTest").
            setProperty("hibernate.connection.username", "portal").
            setProperty("hibernate.connection.password", "").
            setProperty("hibernate.connection.pool_size", "1").
            setProperty("hibernate.connection.autocommit", "true").
            setProperty("hibernate.cache.provider_class", "org.hibernate.cache.HashtableCacheProvider").
            setProperty("hibernate.hbm2ddl.auto", "update").
            setProperty("hibernate.show_sql", "true");
        
        for(PersistentObject o : objects) {
            config.addClass(o.getClass());
        }
        
        if (factory == null) {
            factory = config.configure().buildSessionFactory();
        }        
    }
    
    public void loadPersistentClasses() {
        registry = PluginRegistry.getInstance();
        PersistentObject[] objarray = (PersistentObject[]) registry.getPlugins(PersistentObject.class);
        objects = Arrays.asList(objarray);
        for(PersistentObject o : objects) {
            System.out.println(o.toString());
        }
    }
    
    public Session getHibernateSession() {
        return factory.getCurrentSession();
    }   
}

Das scheint auch tatsächlich zu funktionieren. Wollte ich hier nur kurz mitteilen, vielleicht hat ja noch jemand Tipps für mich wie man das ganze besser machen kann.
Ach ja, ganz ohne hibernate.cfg.xml mag hibernate wohl nicht laufen (oder gibts da nen Trick?) weshalb die im Moment so bei mir aussieht:

XML:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
            <property name="current_session_context_class">thread</property>
    </session-factory>
</hibernate-configuration>

Gruß,
Ace

EDIT: Was ich noch vergessen habe: Könnte noch jemand was zu den angesprochenen XML-Fähigkeiten von Hibernate sagen? Ist es damit einfach durch Anpassen des Mappings möglich mysession.save(myObject); aufzurufen und er haut das Objekt dann in einer XML-Datei auf die Platte? Weil so klingt die Dokumentation für mich irgendwie überhaupt nicht....
 
Zuletzt bearbeitet von einem Moderator:
Hi,

XML Datenbanken speichern komplette XML Strukturen in sogenannten Accelerator-Tabellen. Diese enthalten nichts anderes als den Knoten Typ, Name, Wert und weitere Attribute welche Aufschluss ueber die Hierarchie geben. Des weiteren gibt es verschiedenste Techniken um Anfragen zu beschleunigen. Es seien nur einige genannt wie Pruning, Skipping, Stair Case Join oder auch sogenannte Skeleton. Weiter moechte ich hier aber nicht darauf eingehen.

Ich vermute also, dass Hibernate die Objekte ebenfalls in einer Datenbank speichert, allerdings habe ich keine Ahnung in welcher Form. Sollte dies nicht der Fall sein waere ich ueberrascht und wuerde gerne wissen wie lange denn eine Anfrage fuer eine Liste von Objekten ausschaut, wieviel von solchen Files dann im Speicher liegt und wie Hibernate updates (grosses Problem bei XML Datenbanken) ausfuehrt.

Viele Gruesse,
-- Romsl
 
Zurück