# (Hibernate) Modul möglichst universell gestalten



## LadyMilka (8. Dez 2010)

Hallo,

ich grübel jetzt schon ein paar Tage aber komme irgendwie nicht weiter.
Meine Ziel ist es, eine Schnittstelle/ein Modul zu programmieren, das möglichst universell einsetzbar ist. Dieses Modul kapselt Datenbankabfragen (hier mit Hibernate realisiert). 

Die Idee dahinter ist, dass andere Programmierer nur eine Methode aufrufen und dieser ein paar Werte mitgeben. Sollte dann irgendwann das DBMS gewechselt werden, wo Hibernate nicht möglich bzw. nötig ist, muß man nur dieses Modul tauschen.

Das Problem ist, dass mein Ansatz nicht universell ist. Sollten in einem Projekt neue oder andere Objekte benötigt werden, müsste man diese Modul entsprechend anpassen

Eine Methose sieht zum Beispiel so aus:

```
public List selectList(String object, TreeMap<String, Object> criteria) {
        List list=null;
        System.out.println("Object: "+object);
        if(object.equals("Bla")){
            DetachedCriteria crit = DetachedCriteria.forClass(Bla.class);
            while(criteria.size()>0){
                System.out.println("Key: "+ criteria.firstKey());
                crit.add(Restrictions.eq(criteria.firstKey(), criteria.get(criteria.firstKey())));
                criteria.remove(criteria.firstKey());
            }
            list=getHibernateTemplate().findByCriteria(crit);
        }
        if(object.equals("Blubber"){
            DetachedCriteria crit = DetachedCriteria.forClass(Blubber.class);
            //die gleiche while-Schleife wie bei "Bla"
        }
        return list;
    }
```

Am liebsten wäre es mir, wenn ich beim initialisieren der DetachedCriteria den String als Klassenname übergeben könnte. Ich weiß nicht ob dies möglich ist und meine Versuche blieben erfolglos.

Vielleicht hat jemand ja eine Idee oder andere Hinweise für mich?


----------



## SlaterB (8. Dez 2010)

Class c = Class.forName(string);

allerdings sollte dann im String genau das stehen was
System.out.println(Bla.class.getName());
liefert, also mit package-Namen

wenn du ein richtiges Objekt != null als Parameter übergibst,
kommst du mit object.getClass() an die Klasse, sofern du nicht das Objekt selber an Hibernate übergibts,
dann wird intern schon die Klasse gefunden, etwa bei session.save() und ähnlichen Aufrufen

edit:
und bedenke immer, selbst wenn das obige mal nicht geht: so wenig wie möglich kopieren,
schreibe

```
public List selectList(String object, TreeMap<String, Object> criteria) {
        List list=null;
        System.out.println("Object: "+object);
        DetachedCriteria crit = null;
        if(object.equals("Bla")){
           crit = DetachedCriteria.forClass(Bla.class);
        } else  if(object.equals("Blubber"){
            crit = DetachedCriteria.forClass(Blubber.class);
        }
        // komplizierten Rest nur EINMAL
        return list;
    }
```
oder noch besser

```
public List selectList(String object, TreeMap<String, Object> criteria) {
        List list=null;
        System.out.println("Object: "+object);
        DetachedCriteria crit = null;
        Class c = null;
        if(object.equals("Bla")){
           c = Bla.class;
        } else  if(object.equals("Blubber"){
           c = Blubber.class;
        }
        DetachedCriteria crit = DetachedCriteria.forClass(c);
        // komplizierten Rest nur EINMAL
        return list;
    }
```
bzw. jetzt ja mit dem Class.forName() ganz ohne if möglich


----------



## LadyMilka (8. Dez 2010)

Vielen Dank, ich werde das mit Class.forName mal ausprobieren.

Die anderen Hinweise sind natürlich auch gut, das vermindert ja den Wust an Code der da zusammen kommt.

Edit:
Klasse, das funktioniert.:applaus:

Mir ist auch bewusst, das die Übergebenen Strings auch exakt den Klassennamen entsprechen müssen. Das muß dann in der Dokumentation entsprechend erläutert werden.


----------

