# Hibernate - Problem bei save



## y0dA (13. Sep 2007)

hi!
Ich möchte ein Objekt vom Typ GPRMCModel in die DB schreiben, die Tabelle existiert aber noch nicht (Hibernate sollte sie ja anlegen, falls sie nicht existiert?). Ich benutze eine Oracle 10g XE DB, neuestes Hibernate.

Bekomme bei save folgende Fehlermeldung:

```
WARNUNG: SQL Error: 2289, SQLState: 42000
13.09.2007 15:06:55 org.hibernate.util.JDBCExceptionReporter logExceptions
SCHWERWIEGEND: ORA-02289: Sequence ist nicht vorhanden.
```

In der Exception ist noch folgendes zu finden:

```
could not get next sequence value
select hibernate_sequence.nextval from dual
```

hibernate.config:

```
<?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="hibernate.connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="hibernate.connection.password">navteq</property>
	<property name="hibernate.connection.url">
		****
	</property>
	<property name="hibernate.connection.username">navteq</property>
	<property name="hibernate.dialect">
		org.hibernate.dialect.Oracle9Dialect
	</property>
	<property name="myeclipse.connection.profile">
		****
	</property>
	<property name="connection.url">
		****
	</property>
	<property name="connection.username">****</property>
	<property name="connection.password">****</property>
	<property name="connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="dialect">
		org.hibernate.dialect.Oracle9Dialect
	</property>
	
	<property name="current_session_context_class">thread</property>

	
	<property name="hibernate.show.sql">true</property>
	<mapping
		resource="at/pcd/wam/technologie/persistence/hbm/GPRMCModel.hbm.xml" />
</session-factory>
</hibernate-configuration>
```

hbm file:

```
<?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 package="at.pcd.wam.technologie.persistence.model">
  <class name="at.pcd.wam.technologie.persistence.model.GPRMCModel" table="NMEA_GPRMC" >
  
 	
  	<id name="id" type="string" column="ID">
  	<generator class="native"></generator>
  	</id>  	

  	<property name="checksum" type="string" column="CHECKSUM"></property>
  	<property name="cruiseKnot" type="float" column="CRUISE_KNOT"></property>
  	<property name="date" type="date" column="DATE"></property>
  	<property name="directionDegree" type="float" column="DIRECTION_DEGREE"></property>
  	<property name="latitude" type="double" column="LATITUDE"></property>
  	<property name="latitudeStatus" type="character" column="LATITUDE_STATUS"></property>
  	<property name="longitude" type="double" column="UID_SPERRE"></property>
  	<property name="longitudeStatus" type="character" column="LONGITUDE_STATUS"></property>
  	<property name="magneticDeviation" type="float" column="MAGNETIC_DEVIATION"></property>
  	<property name="magneticDeviationStatus" type="character" column="MAGNETIC_DEVIATION_STATUS"></property>
  	<property name="utcTime" type="date" column="UTC_TIME"></property>
  	<property name="utcTimeStatus" type="character" column="UTC_TIME_STATUS"></property>
  	
  </class>
</hibernate-mapping>
```

bsp code:

```
GPRMCModel testModel = new GPRMCModel();
		testModel.setChecksum("CHECKSUMME TEST");
		testModel.setDate(new Date());

		GPRMCDB.insertNewData(testModel);

public static void insertNewData(final GPRMCModel model) {
		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();	
			/* insert */
			session.save(model);	
			/* commit and close session */
			tx.commit();	
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
		} finally {
			session = null;
			tx = null;
		}
	}
```


----------



## ms (13. Sep 2007)

Probier mal folgendes:

```
<generator class="assigned"/>
```

ms


----------



## sparrow (13. Sep 2007)

Ich arbeite mich ja gerade erst in Hibernate ein, aber ich dachte immer es benötigt folgenden Eintrag in der Configurationsdatei hibernate.conf.xml um Hibernate anzuweisen die Tabellenstruktur entweder beim starten komplett anzulegen (create, allerdings sind dann alle vorheringen Daten weg: also vorsicht!) oder zu updaten (update):

```
<property name="hibernate.hbm2ddl.auto">update</property>
```


----------



## y0dA (13. Sep 2007)

Hi!
Hab nun schon einen Fehler gefunden, anscheinend darf man eine Tabellenspalte nicht "DATE" nennen - hab ich nun geändert. Weiters hab ich "native" als generator class entfernt (kA warum das nicht geht) und anstatt assigned benutzt.
Damit klappt dann zumindest das save, aber speichern bnzw die Tabelle anlegen tut hibernate nicht.

Fehlermeldung:

```
WARNUNG: SQL Error: 942, SQLState: 42000
13.09.2007 15:50:56 org.hibernate.util.JDBCExceptionReporter logExceptions
SCHWERWIEGEND: ORA-00942: Tabelle oder View nicht vorhanden

13.09.2007 15:50:56 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SCHWERWIEGEND: Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at at.pcd.wam.technologie.persistence.db.GPRMCDB.insertNewData(GPRMCDB.java:42)
	at at.pcd.wam.technologie.controller.DummyTest.main(DummyTest.java:19)
Caused by: java.sql.BatchUpdateException: ORA-00942: Tabelle oder View nicht vorhanden

	at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
	at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10656)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	... 9 more
```

Bringt auch keine Änderung (selbe Meldung wie oben "Tabelle oder View nicht vorhanden")

```
<property name="hibernate.hbm2dll.auto">create</property>
```


----------



## sparrow (13. Sep 2007)

Siehe meinen vorheringen Post.


```
<property name="hibernate.hbm2ddl.auto">update</property>
```

Ich habe gerade nachgelesen, Mögliche Werte wie folgt:
UPDATE - verwendet vorhandene Tabellenstrukturen und passt diese notfalls an
CREATE-DROP - Löscht beim Start alle Tabellen und legt sie neu an
CREATE - Eigentlich kein Unterschied zu CREATE-DROP
VALIDATE - Prüft ob das Tabellenschema mit dem Mapping übereinstimmt und bricht sonst ab


----------



## y0dA (13. Sep 2007)

Siehe meinen editierten Post - Die Angabe bringt nichts!


----------



## ms (13. Sep 2007)

CREATE-DROP bringt auch nichts?

ms


----------



## y0dA (13. Sep 2007)

Jo, bringt auch nichts 

btw benutze ich folgende DB:

Oracle Database 10g Express Edition Release 10.2.0.1.0


----------



## ms (13. Sep 2007)

Öhm... DROP-CREATE ?

ms

EDIT:
Nein, kanns auch nicht sein, weil sonst würde er nicht die Meldung bringen.


----------



## sparrow (13. Sep 2007)

Postest du bitte nochmal deine hibernate.conf.xml mit dem Eintrag.
Vielleicht kommt es ja auch auf die Reihenfolge an (wobei ich das nicht glaube)

Bist du sicher, dass die richtige Config-Datei benutzt wird?
Ich habe oft Schwierigkeiten wenn ich das Programm erst unter Eclipse verwende und dann z.B. mit ant starte weil der Classpath dann anders liegt.


----------



## y0dA (13. Sep 2007)

es läuft ja bei mir nichtmal innerhalb von eclipse! und es wird die richtige config benutzt.


```
<?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="hibernate.connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="hibernate.connection.password">navteq</property>
	<property name="hibernate.connection.url">
		***
	</property>
	<property name="hibernate.connection.username">navteq</property>
	<property name="hibernate.dialect">
		org.hibernate.dialect.Oracle9Dialect
	</property>
	<property name="myeclipse.connection.profile">ORACLE_SPATIAL_VM</property>
	<property name="connection.url">***</property>
	<property name="connection.username">***</property>
	<property name="connection.password">***</property>
	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
	
	<property name="current_session_context_class">thread</property>

	
	<property name="hibernate.show.sql">true</property>
	
		
	<property name="hibernate.hbm2dll.auto">create</property>
	
	<mapping
		resource="at/pcd/wam/technologie/persistence/hbm/GPRMCModel.hbm.xml" />
</session-factory>
</hibernate-configuration>
```


----------



## ms (13. Sep 2007)

Was läuft nicht?
Ich dachte save funktioniert mittlerweile?
Kannst du dich überhaupt zur Datenbank connecten?

ms


----------



## sparrow (13. Sep 2007)

Tjoah, ich weiss auch nicht, aber zum testen kannst du ja mal Username und Passwort in der hibernate.conf.xml ändern. Dann dürfte er sich nicht mehr verbinden können und würde einen entsprechenden Fehler bringen hoffe ich.
Das ganze nur als Test ob er wuach wirklich die hibernate.conf.xml verwendet.

Ansonsten könnte ich mir nur Vorstellen, dass es einen Unterschied zwischen Oracle 10 gibt und dem von dir eingesetzen oracle9-Dialekt


----------



## y0dA (13. Sep 2007)

1. Ich kann mich zur DB connecten
2. Er springt über *session.save(model)*
3. Bei *tx.commit()* kommt dann eine Exception:


```
13.09.2007 16:38:39 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNUNG: SQL Error: 942, SQLState: 42000
13.09.2007 16:38:39 org.hibernate.util.JDBCExceptionReporter logExceptions
SCHWERWIEGEND: ORA-00942: Tabelle oder View nicht vorhanden

13.09.2007 16:38:39 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SCHWERWIEGEND: Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at at.pcd.wam.technologie.persistence.db.GPRMCDB.insertNewData(GPRMCDB.java:42)
	at at.pcd.wam.technologie.controller.DummyTest.main(DummyTest.java:19)
Caused by: java.sql.BatchUpdateException: ORA-00942: Tabelle oder View nicht vorhanden

	at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
	at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10656)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	... 9 more
```

Komischerweise seh ich aber nur ein Inserstatement, also wird nie versucht die Tabelle anzulegen.


**EDIT**
Scheiss Eclipse, irgendwie nimmt es keine Änderungen an dem config File an...mal restarten.


----------



## ms (13. Sep 2007)

Laut hibernate dokumentation sollte es so heißen:


```
<property name="hbm2ddl.auto">create</property>
```
und nicht 

```
<property name="hibernate.hbm2ddl.auto">create</property>
```

ms


----------



## ms (13. Sep 2007)

y0dA hat gesagt.:
			
		

> Scheiss Eclipse, irgendwie nimmt es keine Änderungen an dem config File an...mal restarten.


oder F5 drücken

ms


----------



## y0dA (13. Sep 2007)

ms hat gesagt.:
			
		

> y0dA hat gesagt.:
> 
> 
> 
> ...


Also ich kenne nur strg+f5 beim Browser, aber dass es sowas bei eclipse gäbe (sehe nix wenn ich f5 klicke in eclipse)?



			
				ms hat gesagt.:
			
		

> Laut hibernate dokumentation sollte es so heißen:
> 
> 
> ```
> ...



Komisch bisher hatte ich das immer so verwendet (aber anscheinend nie benötigt, da ich immer auf existierende Tabellen zugegriffen habe..naja kA)

mit 

```
<property name="hbm2ddl.auto">create</property>
```

funktioniert es nun wenn ich "assigned" benutze (Was ich aber nicht möchte) - *native* muss doch auch funktionieren?


----------



## *Hendrik (13. Sep 2007)

Die Datenbank wird nicht erst bei SAVE erstellt, sondern bereits wenn Du die Session öffnest. Also muss eigentlich da schon eine Ausgabe kommen und nicht erst beim SAVE.


----------



## ms (13. Sep 2007)

*Hendrik hat gesagt.:
			
		

> Die Datenbank wird nicht erst bei SAVE erstellt, sondern bereits wenn Du die Session öffnest. Also muss eigentlich da schon eine Ausgabe kommen und nicht erst beim SAVE.


Wenn ich mich nicht irre wird sie schon beim Erzeugen der SessionFactory initialisiert.



> ... wenn ich "assigned" benutze (Was ich aber nicht möchte) - *native* muss doch auch funktionieren?


assigned bedeutet, dass du es im Programm zuweisen musst.
native bedeutet, dass die Id in der Datenbank generiert wird (z.B. per Trigger oder serial/postgres oder autoincrement/mysql)
Du weist zu, also assigned.

ms


----------



## *Hendrik (13. Sep 2007)

ms hat gesagt.:
			
		

> Wenn ich mich nicht irre wird sie schon beim Erzeugen der SessionFactory initialisiert.



Stimmt natürlich. War auch darauf bezogen, dass er sich mit HibernateUtil eine Session holt. Dementsprechend wird beim ersten Zugriff auf HibernateUtil dort die SessionFactory initialisiert (und die DB erstellt).


----------



## y0dA (13. Sep 2007)

Ich weise immo nur zu, weil die andere Variante nicht funktioniert hat.


----------



## ms (14. Sep 2007)

Was hast du denn datenbankseitig unternommen um native zu verwenden?

ms


----------



## y0dA (14. Sep 2007)

Hi!
Vorweg danke ich euch für den "Arbeitskreis", es funktioniert nun tadellos.

Also native geht nun auch.

mfg


----------

