Hibernate Benutzerdatenbank logischer Ansatz

Tservarius

Mitglied
Hi,

ich versuche gerade meine ersten Schritte mit Hibernate zu machen und komme dabei an einer Stelle nicht wirklich weiter

Ich habe eine Klasse "User" mit den Attributen
int userid
String vorname
String nachname
User vorgesetzter
List<User> angestellte

Die userid ist der PK, vorname & nachname der name des users.
Der Vorgesetzte soll ein anderer Benutzer seinm welcher über seinen PK identifiziert wird.
Die Liste angestellten, soll die User verwalten, welche wiederrum selbst unter dem Benutzer angeordnet sind.

ich weis leider überhaupt nicht weiter und bin noch nach diversen tutorials und dokus ziemlich ratlos. weis jemand hilfe?

ein user soll also genau einen vorgesetzten haben.
ein user kann selber 0...n angestellte unter sich haben.

danke im voraus!
 
Hallo,

das klingt nach einer many-to-one-Beziehung.

Versuch das mal in deiner Mapping-Datei.

Code:
< many-to-one name ="name der Variablen für den Vorgesetzten" class ="User" >
<column name ="chef" not-null =" true " />
</ many-to-one >


MFG

zEriX
 
hi,
also erstmal danke für deine hilfe.. hatte nicht so ganz funktioniert, habs jetzt einmal umgestellt, nun sieht es wie folgt aus:

das problem:
irgendwie funktioniert das mit den "untergebenen " noch nicht so richtig, jedenfalls wird dafür keine spalte in der datenbank angelegt.

und noch eine logische frage:
wenn ich einen neuen user auf der datenbank anlege, übergebe ich dann den key vom vorgesetzen oder das komplette userobjekt des vorgesetzen (siehe UserManager)

Datenbank Schema:
Code:
CREATE TABLE `user` (
  `userid` int(11) NOT NULL auto_increment,
  `vorname` varchar(255) collate latin1_general_ci default NULL,
  `nachname` varchar(255) collate latin1_general_ci default NULL,
  `vorgesetzter` int(11) default NULL,
  PRIMARY KEY  (`userid`),
  KEY `FK36EBCBD3F17A9B` (`vorgesetzter`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;


User-Klasse:

Code:
package eu.xxx.hrportal.mappings;

import java.util.Set;

public class User {

	private int userid;
	private String vorname;
	private String nachname;

	private User vorgesetzter;
	private Set untergebene;


	public Set getUntergebene() {
		return untergebene;
	}
	public void setUntergebene(Set untergebene) {
		this.untergebene = untergebene;
	}
	public User getVorgesetzter() {
		return vorgesetzter;
	}
	public void setVorgesetzter(User vorgesetzter) {
		this.vorgesetzter = vorgesetzter;
	}
	public String getNachname() {
		return nachname;
	}
	public void setNachname(String nachname) {
		this.nachname = nachname;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}

	public String getVorname() {
		return vorname;
	}
	public void setVorname(String vorname) {
		this.vorname = vorname;
	}

}

Hibernate Mapping: user.hbx.xml

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="eu.xxx.hrportal.mappings.User" table="user">

	<!-- User ID als autoincrement PK -->
    <id name="userid" column="userid" type="java.lang.Integer">
        <generator class="native"/>
    </id>

	<!-- Allgemeine Details mappen  -->
    <property name="vorname" column="vorname" />
    <property name="nachname" column="nachname" />

	<!-- Vorgesetzer mappen -->
	<many-to-one name="vorgesetzter" class="eu.xxx.hrportal.mappings.User" column="vorgesetzter" insert="false" update="false"/>

	<set name="untergebene" cascade="all">
            <key column="vorgesetzter"/>
            <one-to-many class="eu.xxx.hrportal.mappings.User"/>
        </set>

  </class>

</hibernate-mapping>

mein UserManager:

Code:
package eu.xxx.hrportal.dbmanager;
import org.hibernate.Session;
import java.util.List;
import eu.xxx.hrportal.util.HibernateUtil;

//Import Modell
import eu.xxx.hrportal.mappings.User;

public class UserManager {

    public void createAndStoreUser(String vorname, String nachname, User vorgesetzer ) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        //Userobjekt erstellen und danach in die DB schreiben
        User newUser = new User();
        newUser.setVorname(vorname);
        newUser.setNachname(nachname);

        //Aus der ID des vorgesetzen wird hier das Objekt des vorgesetzen ausgelesen
        //Wir erstmal auf sich selbst gesetzt
        //newUser.setVorgesetzter(newUser);

        session.save(newUser);
        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
    }

    public List listUsers() {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        //Daten aus der Datenbank selektieren
        List result = session.createQuery("from User").list();

        //Session bestätigen + schließen
        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();

        return result;

    }

}


Die HibernateUtil zur vervollständigung

Code:
package eu.xxx.hrportal.util;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}
 
Ich hab mir jetzt deine Klassen noch nicht angeschaut. Aber zu deiner Frage
wenn ich einen neuen user auf der datenbank anlege, übergebe ich dann den key vom vorgesetzen oder das komplette userobjekt des vorgesetzen

Am besten legst du ein komplett neues User-Object an. Das befüllst du mit allen Daten die es braucht. Setzt auch den Vorgesetzen. Dann speicherst du es mit
Code:
session.save(user)
in der DB ab.

Was genau funktioniert denn nicht?

MFG

zEriX
 
jep. das ist soweit schon klar und t ja auch.. mein problem besteht jetzt darin, wenn ich die relation schaffen will zum vorgesetzen:

Der Vorgesetzte ist ja ein Datensatz in der DB, der neu angelegte User wird ein eigener, welcher ja über den parameter vorgesetzer auf den anderen Datensatz referenziert.

Momentan ist in der User Klasse der Vorgesetzter als Attribut vom Typ "User" definiert, es muss also ein Userobjekt übergeben werden. Wäre es besser, in der Userklasse den vorgesetzen als ein Integer zu definieren?
Dann hätte ich doch jedoch das Problem dass ich beispielsweise nicht per

Code:
neuerUser.getVorgesetzer.getVorname()

den Vornamen des Vorgesetzen abfragen kann sondern
erstmal die ID des vorgesetzen abfragen muss und dann das Objekt zum Vorgesetzen auslesen. Dachte eigentlich Hibernate unterstützt mich in diesem Punkt, sodass ich eigentlich mit solchen Anweisungen wie
Code:
neuerUser.getVorgesetzer.getVorname()
arbeiten kann.


nochmal in kurz:
muss meine user anlegen methode im manager nun als parameter "vertreter" einen int wert in die datenbank schreiben und hibernate schafft automatisch die verknüpfnung oder muss die methode ein objekt vom typ User in die Datenbank schreiben und hibernate ermittelt aus diesem objekt den userid wert und verwendet dieses als FK für die id des vorgesetzen des users
 
Zuletzt bearbeitet:
Also ich finde das so besser wie du es im moment hast. Der Sinn eines OR-Mappers ist ja, dass du deine fertige Objecte bekommst und nicht nochmal in de DB suchen musst. Durch die Mapping-Datei müsste eigentlich nur der Primary key als Foreign Key in der DB gespeichert werden. Ich kann es hier aber leider nicht ausprobieren, da ich am Arbeiten bin und kein Hibernate hier hab.

MFG

zEriX
 
okay.. ich denke ich werde einfach mal rumprobieren, wie genau ich die parameter übergeben muss, alledings gibts noch ein problem :

der vorgesetze scheint über das mapping richtig verwaltet zu werden, jedenfalls legt hibernate einen FK vom gleichen typ der userid an, schätze also mal, alles ist in ordnung.

die umgedrehte relation, also dass alle untergebenen zu einem user ausgegeben werden, macht jedoch noch probleme, hatte es jetzt wie oben beschrieben angelegt, bekomme jedoch keine resultate. mir ist auch noch nicht so ganz klar wie das ganze logisch funktioniert, da diese ganzen manager keys ja in den jeweiigen datensätzen dieser einen tabelle stehen und nicht normalisiert oder sonstwie in einer anderen tabelle.
 

Neue Beiträge

Zurück