# JSF, Hibernate & MySQL: Keine Datenbankaktualisierung



## Ehdoranil (8. Feb 2007)

Hallo

ich habe folgendes Problem: Ich bin grade am schreiben einer JSF Anwendung, die ihre Datenbank-Anbindung an MySQL mittels Hibernate umsetzt. Hierbei geht es grade um das Registrieren neuer Nutzer im System. Ich erzeuge ein User-Object und speichere dieses über das DAO. Der Code wird ohne Fehler oder Warnungen ausgeführt, im log4j und MySQL-log werden die Befehle auch korrekt angezeigt, aber in der Datenbank befindet sich kein neuer Datensatz ^^

Hier die codes - jeweils stell ich nur die relevanten aspekte dar:

Das Datenbankmodell sieht wie folgt aus:

```
tbluser (
- [u]cntid[/u],
- strname,
- strfirstname,
- stremail,
- strlogin,
- strpass,
- intdeputy,
- intcompany,
- strsystemlanguage, 
- bolenabled,
- stremailcertifiedpass)

tblcompany (
- [u]cntid[/u],
- strname)

tblrole (
- [u]cntid[/u],
- strname)

tbluser_role_request (
- [u]intuser[/u],
- [u]introle[/u])
```

das prefix vorne zeigt den datentyp: int = integer(8), str = varchar(45), bol = tinyint(1), cnt = integer(8) autoincrement

Die JavaKlassen wie folgt (setters und getters hab ich hier mal weggelassen, sie existieren für alle attribute):

```
class User{
 private int id;
 private String name;
 private String firstName;
 private String email;
 private String login;
 private String pass;
 private User deputy;
 private Company company;
 private String systemLanguage;
 private boolean enabled;
 private emailCertifiedPass;

 private List<Role> requestedRoles = new ArrayList<Role>();
}

class Company{
 private int id;
 private String name;

 private List<User> employees = new ArrayList<User>();
}

class Role{
 private int id;
 private String name;
}
```

Das hibernate-mapping:

```
...
<class name="User" table="tbluser">
  <id name="id" column="cntid"><generator class="native" /></id>
  <property name="name" column="strname" />
  <property name="firstName" column="strfirstname" />
  <property name="email" column="stremail" />
  <property name="login" column="strlogin" />
  <property name="pass" column="strpass" />
  <many-to-one name="deputy" column="intdeputy" class="User" />
  <many-to-one name="company" column="intcompany" class="Company" />
  <property name="systemLanguage" column="strsystemlanguage" />
  <property name="enabled" column="bolenabled" />
  <property name="emailCertifiedPass" column="strEmailCertifiedPass" /> 

  <bag name="requestedRoles" tbl="tbluser_role_request" lazy="true" cascade="save-update">
    <key column="intuser" />
    <many-to-many class="Role" column="introle" />
  </bag
</class>

<class name="Company" table="tblcompany">
  <id name="id" column="cntid"><generator class="native" /></id>
  <property name="name" column="strname" />

  <bag name="employees" lazy="true" cascade="save-update">
    <key column="intcompany" />
    <one-to-many class="User" />
  </bag>
</class>

<class name="Role" table="tblrole">
  <id name="id" column="cntid"><generator class="native" /></id>
  <property name="name" column="strname" />
</class>
...
```

Analog zu Hibernate And MyFaces - MyFaces Wiki hab ich einen eigenen OpenSessionInViewFilter eingebunden.
Ich binde eine User-Bean an die Felder des Registrierungsforumlars (Converter für Company und Role existieren) und schreibe dieses Objekt über

```
getHibernateTemplate().save(user);
```
im DAO in die Datenbank.

Der Code wird wunderbar ausgeführt, keine Exception wird geworfen, log4j listet keine Warnungen auf. Der <h:messages /> ist leer. Auch der Filter wird aufgerufen (mit nem system.out.println überprüft).
Leider ist der Datenbankbestand danach immernoch genau der selbe, wie davor 

ich hab mal über hibernate.show_sql und log4j.logger.org.hibernate.type=debug die hibernate-sql anweisungen ausgeben lassen:

```
Hibernate: insert into tblUser (
    strName, strFirstName, strEmail, strLogin, strPass,
    intDeputy, intCompany, strSystemLanguage, bolEnabled,
    strEmailCertificatePass) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'MYLASTNAME' to parameter: 1
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'MYFIRSTNAME' to parameter: 2
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'MYEMAIL' to parameter: 3
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'MYLOGIN' to parameter: 4
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'MYPASS' to parameter: 5
DEBUG [http-8080-1] (NullableType.java:52) ?? binding null to parameter: 6
DEBUG [http-8080-1] (NullableType.java:59) ?? binding '1' to parameter: 7
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'de' to parameter: 8
DEBUG [http-8080-1] (NullableType.java:59) ?? binding 'false' to parameter: 9
DEBUG [http-8080-1] (NullableType.java:59) ?? binding null to parameter: 10
Hibernate: insert into tblUser_Role_Request (intUser, intRole) values (?, ?)
DEBUG [http-8080-1] (NullableType.java:59) ?? binding '2' to parameter: 1
DEBUG [http-8080-1] (NullableType.java:59) ?? binding '1' to parameter: 2
Hibernate: insert into tblUser_Role_Request (intUser, intRole) values (?, ?)
DEBUG [http-8080-1] (NullableType.java:59) ?? binding '2' to parameter: 1
DEBUG [http-8080-1] (NullableType.java:59) ?? binding '2' to parameter: 2
```

Die Spalten sind nullable, die Rollen #1 und #2 exitieren. MySQL ist nicht case-sensitive...
nun - ich hab auch das mysql.log da:

```
4 Prepare     [8] insert into tblUser (
   strName, strFirstName, strEmail, strLogin, strPass,
   intDeputy, intCompany, strSystemLanguage, bolEnabled,
   strEmailCertificatePass) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
4 Execute     [8] insert into tblUser (
   strName, strFirstName, strEmail, strLogin, strPass,
   intDeputy, intCompany, strSystemLanguage, bolEnabled,
   strEmailCertificatePass) values 
   ('MYLASTNAME', 'MYFIRSTNAME', 'MYEMAIL', 'MYLOGIN', 'MYPASS', NULL, 1, 'de', 0, NULL)
7 Query       SHOW GLOBAL STATUS
7 Query       SHOW INNODB STATUS
4 Prepare     [9] insert into tblUser_Role_Request (intUser, intRole) values (?, ?)
4 Execute     [9] insert into tblUser_Role_Request (intUser, intRole) values (2, 1)
4 Execute     [9] insert into tblUser_Role_Request (intUser, intRole) values (2, 2)
```

findet einer den Fehler? Ich verzweifle noch hier 

Vielen Dank für eure Hilfe


----------



## sanduleak (15. Feb 2007)

Ne, wie soll man da einen Fehler finden in dem ganzen Wirrwar.
Mich würde aber mal interessieren, wo man da die xml Dateien reinmacht und und was für ein Projekt man braucht wenn man mit Hibernate arbeitet, dass es funktioniert?
Gibt es da Informationsquellen dazu?


----------



## KSG9|sebastian (16. Feb 2007)

Der Fehler liegt daran dass keine Transaktion gestartet wird. Hatte ich schon öffters.

```
Transaction tx = getHibernateTemplate().getSession().beginTransaction();
getHibernateTemplate().save();
tx.commit();
```

Das ist aber im Endeffekt nur "pfusch". Musst mal schauen woran das liegt dass keine Transaktionen verwendet werden. Evtl. TransactionProvider in der hibernate.cfg.xml einstellen.


----------



## KSG9|sebastian (16. Feb 2007)

@sanduleak: Völlig egal was für ein Projekt du hast. Wenn du ne DB benützt dann kannste Hibernate verwenden.


----------



## AlArenal (16. Feb 2007)

sanduleak hat gesagt.:
			
		

> Ne, wie soll man da einen Fehler finden in dem ganzen Wirrwar.
> Mich würde aber mal interessieren, wo man da die xml Dateien reinmacht und und was für ein Projekt man braucht wenn man mit Hibernate arbeitet, dass es funktioniert?
> Gibt es da Informationsquellen dazu?



Was für ein Wirrwarr??

Klar gibt es Infos, z.B. auf der Hibernate Website, im Forum, auf Google, ...


----------



## KSG9|sebastian (16. Feb 2007)

Kann da AlArenal nur zustimmen. Ich arbeite schon seit den Anfängen von Hibernate damit. Und ganz am Anfang war es wirklich sehr mau mit Doku. Mittlerweile ist es imho absolut Klasse. Schon alleine was der Hibernate Reference Guide hergibt reicht für fast jedes Projekt. Integration anderer Frameworks ist auch sehr gut Dokumentiert. Beispielanwendungen werden mitgeliefert. Ich weiß nicht was du noch willst


----------

