Problem beim Insert mit Hibernate

  • Themenstarter Themenstarter Stumpi
  • Beginndatum Beginndatum
S

Stumpi

Gast
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 :-(

Java:
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
 
Ich hab folgendes "gebaut"

Java:
<?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>

Java:
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
				+ "]";
	}
	
	
	
	

}
 
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.
 
Ich glaube ich habs..bald

Java:
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:

Java:
    <property name="show_sql">true</property>

Da kam dann das in der Console:

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

Java:
<?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>
 
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
 
Zuletzt bearbeitet von einem Moderator:
Dann sag ich doch mal danke sehr, das wars!!

Habe nun

Java:
 <generator class="assigned"/>

eingetragen und dann ging es!

Gruß

Stumpi
 

Zurück
Oben