Hibernate - Problem bei save

y0dA

Erfahrenes Mitglied
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:
Code:
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:
Code:
could not get next sequence value
select hibernate_sequence.nextval from dual

hibernate.config:
Code:
<?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>
	<!-- Enable Hibernate's automatic session context management -->
	<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:
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 package="at.pcd.wam.technologie.persistence.model">
  <class name="at.pcd.wam.technologie.persistence.model.GPRMCModel" table="NMEA_GPRMC" >
  
 	<!-- primary key -->
  	<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:
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;
		}
	}

**EDIT**
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:
Code:
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
 
Zuletzt bearbeitet:
Du kannst das SQL zum Anlegen des Schemas entweder mit den Hibernate Tools erzeugen. Dies ist sicherlich der richtige Weg um ein System in die Produktion zu überführen, da der DBA sicherlich an den Script noch Anpassungen (Storage Parameter,..) vornehmen will.

Solange Du noch in der Entwicklung bist, ist die folgende Option in der <persistence-unit/> (persistence.xml) hilfreich:
Code:
	<property name="hibernate.hbm2ddl.auto" value="update" />
Der Wert kann update, create, create-drop sein (wenn ich das richtig im Kopf hab)

Gruß
 
Mit dem Update habe ich manchmal Probleme. Wenn es sich nur um Testdaten handelt dann nimm value="create", die Daten sind danach zwar futsch aber die Tabellen sind auf jeden Fall korrekt.
 
Hi!
Danke für die Antworten, hab es mittlerweile geschafft!

Folgende Fehler hatte ich fabriziert:
1. Eine Tabellenspalte nicht "DATE" nennen.
2. Wenn die Tabelle noch nicht existiert,
Code:
<property name="hibernate.hbm2ddl.auto" value="create" />
benutzen

Somit hat dann alles geklappt, nun würde mich noch interessieren, wie man mit hibernate.tools Tabellen anlegt (wurde hier ja erwähnt)?

mfg
 
Zurück