Hibernate - Transaction Problem

y0dA

Erfahrenes Mitglied
Hi!
Brauche ich folgendes auch wenn ich nur Objekte lade und nichts schreibe:
Code:
tx.commit();

Hier die ganze Methode:
Code:
public static VSegmentDetectionModel loadSegment(final Integer gpsId) {
	
		StringBuffer sb = new StringBuffer();
		sb.append(" select {vSegmentDetection.*} ");
		sb.append(" from ");
		sb.append(VSegmentDetectionDB.TABLE_NAME);
		sb.append(" {vSegmentDetection} ");
		sb.append(" where ");
		sb.append(VSegmentDetectionDB.COLUMN_GT_ID);
		sb.append(" = ");
		sb.append(gpsId);
		
		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		
		VSegmentDetectionModel model = new VSegmentDetectionModel();
		
		try {
			tx = session.beginTransaction();	
			SQLQuery q = session.createSQLQuery(sb.toString());
			q.addEntity("vSegmentDetection", VSegmentDetectionModel.class);
			model = (VSegmentDetectionModel) q.uniqueResult();
			/* commit and close session */
			tx.commit();	
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
				e.printStackTrace();
			}
		} finally {
			session = null;
			tx = null;
		}
		return model;
	}

Hier leseich einfach alle Daten aus einer View wo die Bedingung passt. Hierbei arbeite ich auch mit Oracle Spatial Objekten und wenn ich ebendiese hierbei lade, dann bekomme ich bei
Code:
tx.commit();
folgende Exception:
Code:
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:142)
	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.VSegmentDetectionDB.loadSegment(VSegmentDetectionDB.java:113)
	at at.pcd.wam.technologie.batch.Test.main(Test.java:11)
Caused by: java.sql.BatchUpdateException: ORA-01733: Virtuelle Spalte hier nicht zulässig

	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

mapping file zu der view:
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.VSegmentDetectionModel" table="V_SEGMENT_DETECTION" >
  
 	<!-- primary key -->
  	<id name="gpsId" type="integer" column="GT_ID">
  	<generator class="assigned"></generator>
  	</id>  	

	<property name="fGeom" type="at.pcd.wam.technologie.persistence.custom.type.JGeometryType" column="F_GEOM" />
	<property name="gGeom" type="at.pcd.wam.technologie.persistence.custom.type.JGeometryType" column="GT_GEOM" />
	<property name="distance" type="double" column="DISTANCE"></property>
	<property name="featureId" type="integer" column="F_ID"></property>
	<property name="featureName" type="string" column="F_NAME"></property>
	<property name="gpsTourId" type="integer" column="GT_TOUR_ID"></property>
	
  </class>
</hibernate-mapping>

Warum wird hier plötzlich ein Update durchgeführt?
Also braucht man das Transaktions-Commit auch beim laden?

mfg
 
Versteh ich leider auch nicht. Wird eventuell versucht das model object, das Du aus der Query liest zu sichern? Eventuell mal das logging der SQL Statements einschalten, dann kann man eventuell sehen was gemacht werden soll.

Man kann ja einzelne Attribute auf readonly setzen, geht das auch für ein ganzes Mapping?

Gruß
 
mal das logging der SQL Statements einschalten, dann kann man eventuell sehen was gemacht werden soll.
Gruß
Wie mache ich das?

btw. habe ich das Problem so behoben wie du gemeint hast, also dass auf das property kein update/insert möglich ist:
Code:
<property name="fGeom" type="at.pcd.wam.technologie.persistence.custom.type.JGeometryType" column="F_GEOM"
		insert="false" update="false" />

mfg
 
Zuletzt bearbeitet:
Schön das das Problem erstmal wech ist.

Das logging des SQL kann man per
Code:
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="use_sql_comments" value="true" />
in der persistence.xml einstellen.

Gruß
 
Zurück