# Problem beim Insert mit Hibernate



## Stumpi (27. Apr 2011)

Hallo zusammen,

ich schreibe gerade eine kleine Anwendung in Java und probiere mich mit Hibernate aus, leider weiß ich nicht, wie ich die Fehlermeldung zu deuten habe :-(


```
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See [url=http://www.slf4j.org/codes.html#StaticLoggerBinder]SLF4J Error Codes[/url] for further details.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [Instrument]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2345)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
	at HibernateTest.main(HibernateTest.java:23)
Caused by: java.sql.SQLException: DEFAULT keyword cannot be used as column has no DEFAULT
	at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
	at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
	at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:524)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:116)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.prepare(IdentityGenerator.java:90)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:54)
	... 16 more
Caused by: org.hsqldb.HsqlException: DEFAULT keyword cannot be used as column has no DEFAULT
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
	at org.hsqldb.ParserCommand.compilePart(Unknown Source)
	at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
	at org.hsqldb.Session.compileStatement(Unknown Source)
	at org.hsqldb.StatementManager.compile(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 22 more
```

Vielleicht kann mir jemand einen Tipp gegen?

Danke und Gruß

Stumpi


----------



## mvitz (27. Apr 2011)

Wie sieht/sehen denn deine Entity-Bean(s) aus?


----------



## Stumpi (27. Apr 2011)

Ich hab folgendes "gebaut"


```
<?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="Instrument" table="Instrument">
    <id name="ISIN" column="ISIN" type="string">
      <generator class="native"/>
    </id>
    <property name="WKN"  column="WKN"  type="string" not-null="false"/>
    <property name="Name"   column="Beschreibung"   type="string" not-null="false"/>
    <property name="ersterHandelstag"   column="ersterHandelstag"   type="date" not-null="false"/>
    <property name="letzterHandelstag" column="letzterHandelstag" type="date" not-null="false"/>
   <property name="art" column="art" type="string" not-null="false"/>
  </class>
</hibernate-mapping>
```


```
import java.sql.Date;




public class Instrument {
	private String ISIN;
	private String WKN;
	private String Name;
	private Date ersterHandelstag;
	private Date letzterHandelstag;
	private String art; 

	public Instrument(String iSIN, String wKN, String name,
			Date ersterHandelstag, Date letzterHandelstag, String art) {
		super();
		ISIN = iSIN;
		WKN = wKN;
		Name = name;
		this.ersterHandelstag = ersterHandelstag;
		this.letzterHandelstag = letzterHandelstag;
		this.art = art;
	}
	public Date getErsterHandelstag() {
		return ersterHandelstag;
	}
	public void setErsterHandelstag(Date ersterHandelstag) {
		this.ersterHandelstag = ersterHandelstag;
	}
	public Date getLetzterHandelstag() {
		return letzterHandelstag;
	}
	public void setLetzterHandelstag(Date letzterHandelstag) {
		this.letzterHandelstag = letzterHandelstag;
	}
	public String getArt() {
		return art;
	}
	public void setArt(String art) {
		this.art = art;
	}
	public String getISIN() {
		return ISIN;
	}
	public void setISIN(String iSIN) {
		ISIN = iSIN;
	}
	public String getWKN() {
		return WKN;
	}
	public void setWKN(String wKN) {
		WKN = wKN;
	}
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}

	public Instrument() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String toString() {
		return "Instrument [ISIN=" + ISIN + ", WKN=" + WKN + ", Name=" + Name
				+ ", ersterHandelstag=" + ersterHandelstag
				+ ", letzterHandelstag=" + letzterHandelstag + ", art=" + art
				+ "]";
	}
	
	
	
	

}
```


----------



## mvitz (27. Apr 2011)

Sieht auf den ersten Blick ok aus. Evtl. noch den Code wo du die Daten einfügst. Ansonsten dein gemapptes Objekt erstmal einfacher machen (nur ID) und dann nach und nach Felder wieder hinzufügen.


----------



## Stumpi (27. Apr 2011)

Ich glaube ich habs..bald


```
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class HibernateTest {
	public static void main(String args[]){
		Configuration con;
		con = new Configuration().configure();
		SessionFactory sessionFactory;
		sessionFactory = new Configuration().configure().buildSessionFactory();
		Session s = sessionFactory.openSession();
		Transaction t = s.beginTransaction();
		Instrument i = new Instrument();
		i.setISIN("DE000ABCDEF0");
		s.save(i);
		t.commit();
		

	}

}
```

In meiner Hibernate Config habe ich mal das angeschaltet:


```
<property name="show_sql">true</property>
```

Da kam dann das in der Console:

Hibernate: insert into Instrument (ISIN) values (default)


----------



## mvitz (27. Apr 2011)

Du solltest evtl. noch irgendwo einstellen, welchen Datenbank Dialect Hibernate nutzen soll.


----------



## Stumpi (27. Apr 2011)

Hab ich


```
<?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">
      org.hsqldb.jdbcDriver
    </property>
    <property name="hibernate.connection.url">
      jdbc:hsqldb:file:c:/temp/testdb;shutdown=true
    </property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password"></property>
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    <property name="show_sql">true</property>
    <property name="transaction.factory_class">
      org.hibernate.transaction.JDBCTransactionFactory
    </property>
    <property name="hibernate.cache.provider_class">
      org.hibernate.cache.HashtableCacheProvider
    </property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <mapping resource="Instrument.hbm.xml"/>

  </session-factory>
</hibernate-configuration>
```


----------



## mvitz (27. Apr 2011)

Ich teste das morgen mal selber aus, hab da jetzt nicht mehr die Lust zu.


----------



## Marcinek (27. Apr 2011)

Hallo,

wenn der Generator für die ID Spalte native ist, dann kannst du den nicht beliebig setzten. Es darf für die Spalte kein Generator eingetragen werden.

Der native nutzt i.d.R. autoincrement Funktion der Datenbank um dadurch den "default" wert in die DB einzutragen.

Die Tabelle ist aber nicht als autoincrement deklariert.

Ist zwar sehr knapp aber ich denke das hilft ein wenig:

Understanding Hibernate <generator> element

Gruß,

Martin


----------



## Stumpi (28. Apr 2011)

Dann sag ich doch mal danke sehr, das wars!!

Habe nun


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

eingetragen und dann ging es!

Gruß

Stumpi


----------

