Hibernate INSERT Problem

Status
Nicht offen für weitere Antworten.

SilentJ

Bekanntes Mitglied
Moin,

Hibernate wirft bei mir folgende Fehlermeldung aus:
Code:
org.hibernate.HibernateException: could not determine type of dynamic entity

Ich habe zuvor eine hbm.xml-Datei mit folgendem Inhalt erstellt (in Auszügen):

Code:
<hibernate-mapping auto-import="true" >
	<class name="de.infobench.data.RegularUser"
	entity-name="User" table="regularuser">
		
		<id name="id" unsaved-value="0">
			<generator class="native" />
		</id>
		
		
		<property 
			name="username" 
			column="username" 
			type="string" 
			length="20"
			not-null="true"
		/>

Zum Anlegen eines neuen Datensatzes habe ich folgenden Code geschrieben:

Code:
public RegularUser save(RegularUser ru)
	{
		logger.info("BENUTZER SPEICHERN.");
		Session s = null;
		Transaction tx = null;
		try{
		s = getSessionFactory().openSession();
		tx = s.beginTransaction();
		
		Map newUser = new HashMap();
		newUser.put("username", ru.getUsername());
		newUser.put("password", ru.getPassword());
		newUser.put("title", ru.getTitle());
		newUser.put("firstname", ru.getFirstname());
		newUser.put("name", ru.getName());
		newUser.put("email", ru.getEmail());
		newUser.put("defaultOE", ru.getDefaultOE());
		newUser.put("active", ru.isActive());
		logger.info("USER wird gespeichert");
		s.save(newUser);
		tx.commit();
		
		}catch(HibernateException ex){
			convertHibernateAccessException(ex);
			logger.warn("FEHLER:" + ex);
		}
                ...

Ich weiß nicht, wo der Fehler liegt, für Tipps wäre ich sehr dankbar.

Michael
 
Hallo,

du gibst im Mapping-File an das du den Typ de.infobench.data.RegularUser speichern willst.

in der Methode
Code:
public RegularUser save(RegularUser ru)

versucht du aber eine HashMap zu speichern --> s.save(newUser) --> newUser = HashMap.

Daher bekommst du von Hibernate den Fehler.

statt newUser.put(Object,Object) nimm ru.setXX.

zum Schluss ruf die Methode s.save(ru auf).

lg Peter
 
Hallo Peter,

vielen Dank für deine Antwort. Ich bin jetzt ein Stück weiter.

In meinem Log taucht nun leider aber eine
Code:
org.hibernate.MappingException: Unknown entity: de.infobench.data.RegularUser
Exception auf. Ich habe doch alles definitiert. Verdammte Kiste.

🙁
 
Zum einen wenn nicht nötig entity-name="User" im mapping-File entfernen.
Als zweites würde ich den package namen "de.infobench.data.RegularUser" überprüfen

lg Peter
 
selber von Null auf irgendwelchen Kram zusammenzuschreiben ist selten sinnvoll,
warum hat dein Objekt eigentlich 8 Attribute oder noch mehr?
würde nicht eins reichen um erstmal zu testen ob es überhaupt geht?

aber es macht ja in jeder Hinsicht keinen Sinn, das selber zu versuchen,
probiere bitte vorher ein Tutorial

http://www.laliluna.de/first-hibernate-example-tutorial.html

wenn das auch nicht bei dir läuft,
ok, dann kann überlegen, aber dann ist zumindest die Wahrscheinlichkeit irgendwelcher Tippfehler kleiner,

wenn es läuft dann ist alles in Butter,
dann muss du nur nach und nach Tabellen- und Attributnamen ändern, bis es irgendwann wie deins aussieht
 
Hallo Peter,

jetzt funktioniert es, nur ist jetzt das Problem, dass ich anscheinend bei MySQL nicht mit dem Boolean-Datentyp arbeiten kann. :x

Wenn ich in der Administrationsoberfläche für das Feld active Boolean einstellen möchte, macht mir der MySQL-Administrator daraus TINYINT(1).

Deshalb ist wahrscheinlich auch die Fehlermeldung zu erklären:

Code:
Incorrect integer value: 'T' for column 'active' at row 1

Also irgendwie verstehe ich nicht, warum ich keinen Boolean abspeichern kann.
 
kannst du schon, musst du nur im Mapping-File auch als solches kennzeichnen.

Bsp.
Code:
<property   name="prop"
                type="true_false" >
        <column name="prop"  length="1" />
</property>

lg Peter
 
Hallo Peter,

das funktioniert nicht bei mir, ich erhalte immer noch die gleiche Fehlermeldung.

Code:
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

Das obrige Code-Fragment dürfte keine Rolle spielen - oder muss ich explizit MySQLInnoDialect angeben?

Vielen Dank für die bisherigen Tipps

Michael
 
Übrigens active ist in meiner Klasse als

Code:
private boolean active
deklariert.

In der hbm.xml sieht es so aus:

Code:
		<property 
			name="active" 
			type="true_false">
			<column name="active" length="1"></column>
		</property>
 
warum length=1? also wenn ich boolean's abgespeichert hab hat alles wunderbar geklappt..und mysql macht daraus dann eben nen tinyint...
 
Just to say 'danke' as I had the same problem with

"could not determine type of dynamic entity"

and that your post (with help of google translate) solved it.

For other english speakers out there, it's caused by entities implementing java.util.Map. This confuses hibernate and causes it to throw this error when Session.save() is called. Remove 'implements Map' and everything works fine.
 
Warum überhaupt einen Typ angeben? Hibernate müsste das auch so kapieren.
Sonst versuch mal mit Objekten zu arbeiten udn gib als Typ java.lang.Boolean an.
Dürfte aber eigenltich kein Problem geeben..
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben