# Hibernate setzt values(?,?,?)



## low1337 (13. Dez 2007)

Hi Leutz,

Ich bin echt verzeweifelt. Ich hab jetzt mindestens schon 4 Tutorials durch und Hibernate läuft immernoch nicht.

Meine Datenbank läuft und die hibernate config ist korrekt eingestellt und er kann auch zu meiner Datenbank sich verbinden. ( Beim ersten insert den ich ausgeführt hatte, hat Hibernate erstmal alle meine Tabellen gelöscht.  Also muss er ja ne Verbindung hergestellt haben ).

Ich benutzt Java 5.0 + Hibernate 3.2.5 + Eclipse + MySQL Datenbank

Als Fehlermeldung bekomm ich immer : 

Hibernate: insert into person (name, alter, id) values (?, ?, ?)
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

Anscheind kann die save Methode mit dne Objekt nix anfangen und schreibt daher ? in das Statement und dann kommt natürlich ne SQL Syntaxfehler..     Aber warum kann er mein Objekt nicht benutzen ?


Vielen Dank schonmal für eure Hilfe

hier erstmal meine 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="connection.driver_class">com.mysql.jdbc.Driver</property>  
         <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  
         <property name="connection.username">root</property>  
         <property name="connection.password"></property>  
  		
          
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>  
   
             
           <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
           
           
         <property name="current_session_context_class">thread</property>  
   
            
            
          <property name="hibernate.show_sql">true</property>
          
    	<mapping resource="test/Person.hbm.xml"/>
      </session-factory>  
 </hibernate-configuration>
```
[/code]

Das ist meine abzubildene Klasse


```
package test;
import java.io.Serializable;

import javax.persistence.GeneratedValue;

public class Person implements Serializable
{	
	private int _id;
	
	private int _alter;	
	
	private String _name;
	public int get_id() {
		return _id;
	}
	public void set_id(int _id) {
		this._id = _id;
	}
	public int get_alter() {
		return _alter;
	}
	public void set_alter(int _alter) {
		this._alter = _alter;
	}
	public String get_name() {
		return _name;
	}
	public void set_name(String _name) {
		this._name = _name;
	}
}
```

Und hier die Mapping File dazu.  ( Mit Annotations hat garnix geklappt )


```
<?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>
  <class name="test.Person" table="person">
    <id name="_id" column="id" >
      <generator class="assigned"/>
    </id>
    <property name="_name"  column="name"  />
    <property name="_alter" column="alter" />     
  </class>
</hibernate-mapping>
```

Und hier nun der Aufruf.


```
package test;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class test 
{	
	public static void main(String[] args) 
	{		
		SessionFactory sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory(); 
						
		Session session = null;
		Transaction transaction = null;
		   
		 Person p = new Person();
		 p.set_alter(21);		  
		 p.set_name("dennis");
		 p.set_id(2);
		 try 
		 { 
			   session = sessionFactory.openSession();					  
			   transaction = session.beginTransaction();
			   session.save(p);		   
			   transaction.commit();		   
		   } 
		 catch (HibernateException  e) 
		 {  			   
		      System.out.println(e.toString());
		      if(transaction != null)
		    	  transaction.rollback();
		 }  
		 session.close(); 
	}
}
```


----------



## SnooP (13. Dez 2007)

Ne - das heißt es nicht... die ? kommen durch das Prepared-Statement und die werden schon durch jdbc bereitgestellt - die Anzeige schafft es leider nicht, die ? wieder aufzulösen.. wenn man die log4j für hibernate entsprechend auf debug runterschraubt, bekommt man die parameter wieder zu Gesicht.

Problem könnte bei dir sein, dass du keinen type im Mapping angegeben hast? Evtl. auch Integer verwenden?


----------



## SlaterB (13. Dez 2007)

auf das verrückte 
property name="_id" + _id + set_id + get_id
würde ich auch verzichten,

bewährt ist

property name="id" + id + setId + getId


----------



## SnooP (13. Dez 2007)

du hast seine Sig: c# forever nicht beachtet  ...


----------



## low1337 (13. Dez 2007)

SnooP hat gesagt.:
			
		

> Ne - das heißt es nicht... die ? kommen durch das Prepared-Statement und die werden schon durch jdbc bereitgestellt - die Anzeige schafft es leider nicht, die ? wieder aufzulösen.. wenn man die log4j für hibernate entsprechend auf debug runterschraubt, bekommt man die parameter wieder zu Gesicht.
> 
> Problem könnte bei dir sein, dass du keinen type im Mapping angegeben hast? Evtl. auch Integer verwenden?



Ich hatte den Typ zum testen mal weggenohmen.  Also daran liegt es leider auch nicht.

Außerdem hat das Problem ja nix mit meiner Sig zu tun 

@SlaterB
Ok, habs geändert aber ist ja nur ein schönheitsfehler...

Hab folgenden Fehler

12:44:04,774 ERROR JDBCExceptionReporter:78 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'alter, id) values ('dennis', 21, 2)' at line 1
12:44:04,777 ERROR AbstractFlushingEventListener:301 - 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 test.test.main(test.java)
Caused by: java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'alter, id) values ('dennis', 21, 2)' at line 1
	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1346)
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1047)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	... 8 more
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update


----------



## SnooP (13. Dez 2007)

versuch den insert doch mal via sql-tool manuell abzuschießen... - kann es sein, dass alter ein keyword in mysql ist?


----------



## maki (13. Dez 2007)

ALTER ist ein Keyword, in fast jedem SQL Dialekt.


----------



## low1337 (13. Dez 2007)

oh man ich liebe euch..
funzt alles...

ey ich könnte mich hauen...


----------



## SnooP (13. Dez 2007)

ich fand's nur schade, dass mysql das nicht mitgegeben hat... aber oracle hätte wahrscheinlich auch nur ne lustige ORA-Nr zurückgeworfen


----------



## raptor (14. Dez 2007)

maki hat gesagt.:
			
		

> ALTER ist ein Keyword, in fast jedem SQL Dialekt.


Ist ALTER nicht sogar SQL Standard? Meine das wir das in der Vorlesung hatten und da haben wir SQL92 gemacht.


----------



## maki (14. Dez 2007)

Danke ja raptor.

alter table etc. pp.

Das Problem gibt es übrigens öfters hier *g*
http://www.java-forum.org/de/viewtopic.php?t=56807&highlight=sql+alter


----------



## Gast (14. Dez 2007)

aha ok, den thread hatte ich nicht gesehn...

Ich hatte einige Threads und auch ganze Foren druchforstet aber meist waren es andere Fehler.


----------

