# Hibernate & hsqldb: Problem bei db-update



## norman (31. Mrz 2006)

hallo zusammen,

da ich mich derzeit in hibernate einarbeite habe ich als test eine persistene klasse Message im package hello geschrieben. dazu auch ein entsprechendes mapping file.
hat auch prima geklappt, ich kann neue Messages in die db speichern und sie mir auch wieder anzeigen lassen.

2. schritt war der versuch, eine Message die bereits in der db ist, zu ändern (code siehe unten)..

zunächst mal die fehlermeldung: 
	
	
	
	





```
Exception in thread "main" org.hibernate.HibernateException: CGLIB Enhancement failed: hello.Message
	at org.hibernate.proxy.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:102)
	at org.hibernate.proxy.CGLIBProxyFactory.getProxy(CGLIBProxyFactory.java:47)
	at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
	at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
	at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
	at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
	at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
	at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
	at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774)
	at hello.Testklasse.updateMessage(Testklasse.java:54)
	at hello.Testklasse.main(Testklasse.java:66)
Caused by: java.lang.InstantiationException: hello.Message$$EnhancerByCGLIB$$3b1b87f7
	at java.lang.Class.newInstance0(Class.java:335)
	at java.lang.Class.newInstance(Class.java:303)
	at org.hibernate.proxy.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:99)
	... 11 more
```

und wann tritt der auf? ==> Zeile 54
	
	
	
	





```
package hello;

import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;


public class Testklasse {
	
	private SessionFactory mySessionFactory; // nur 1 SessionFactory => not lightweight!
											 // Session = ligthweight -> kann viele geben 
	
	public Testklasse() {
		Configuration cfg = new Configuration(); // to specify location of mapping-files & properties
		cfg.configure();
		try {
			this.mySessionFactory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}

	
	public void saveMsgToDataBase(Message message) throws HibernateException {		
		Session session = this.mySessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		session.save(message);
		tx.commit();
		session.close();
	}
	
	public void retrieveAllMessages() throws HibernateException {
		Session session = this.mySessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		List messages = session.find("from Message as m order by m.id asc");
		System.out.println(messages.size() + " message(s) found:");
		for (Iterator iter = messages.iterator(); iter.hasNext();) {
			Message message = (Message) iter.next();
			System.out.println(message);
		}
		tx.commit();
		session.close();
	}
	
	public void updateMessage(long msgId, String newText) {
		Session session = this.mySessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		// next line throws HibernateException: CGLIB Enhancement failed: hello.Message
		Message msg = (Message) session.load(Message.class, new Long(msgId)); 
		msg.setText(newText);
		msg.setIsUpdated(true);
		tx.commit();
		session.close();
	}
	
	public static void main(String[] args) throws InterruptedException {
		Testklasse tk = new Testklasse();
		
		tk.retrieveAllMessages();
		Thread.sleep(1000);	System.out.println("\n");
		tk.updateMessage(1, "txtWurdeGeändert");
		tk.retrieveAllMessages();		
	}
}
```


google brachte ein paar hinweise, man solle doch alle CGLIBs aus dem projekt nehmen, aber dann kann ich nicht mehr kompilieren.

falls wichtig kann ich auch die Message-klasse und mapping file posten, spielt aber keine rolle oder?


grüße
norman


----------



## Bleiglanz (1. Apr 2006)

du brauchst alle CGLIBs im Classpath, weil Hibernate selbst mit Bytecode herumwurstelt??

also nicht rausnehmen?


----------



## norman (3. Apr 2006)

Bleiglanz hat gesagt.:
			
		

> du brauchst alle CGLIBs im Classpath, weil Hibernate selbst mit Bytecode herumwurstelt??
> 
> also nicht rausnehmen?


so auch meine meinung, aber dann kommt eben der oben genannte fehler "CGLIB Enhandement failed"..  :bahnhof: 
hier die libs:


----------



## Ivanhoe (3. Apr 2006)

Die Hibernate-Exceptions sind oft unübersichtlich. Kannst du auch deine hibernate.cfg.xml bzw. hibernate.properties hier posten?


----------



## norman (3. Apr 2006)

jup..hier die hibernate.cfg.xml:

```
<?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">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>

        
        <property name="connection.pool_size">1</property>

        
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

        
        <property name="current_session_context_class">thread</property>

        
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

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

        
      

        <mapping resource="hello/Message.hbm.xml"/> 

    </session-factory>

</hibernate-configuration>
```


----------



## Ivanhoe (3. Apr 2006)

versuch mal mit session.get(....) anstatt session.load(...)
Funktioniert retrieveAllMessages() überhaupt?


----------



## norman (3. Apr 2006)

Ivanhoe hat gesagt.:
			
		

> versuch mal mit session.get(....) anstatt session.load(...)
> Funktioniert retrieveAllMessages() überhaupt?


mit get funktioniert es, d.h. ich konnte das objekt verändern (oder den eintrag in der tabelle).

der fehler: "CGLIB Enhancement failed: hello.Message" bleibt jedoch und taucht im übrigen jetzt auch auf, wenn ich die daten nur holen will.

ansonsten scheint es aber zu funktionieren.
beispiel: 
1. daten ausgeben
2. den text von message nr 1 ändern
3. daten ausgeben 
:arrow: 

```
public static void main(String[] args) {
		Testklasse tk = new Testklasse();
		
		tk.retrieveAllMessages();
		System.out.println("\n");
		tk.updateMessage(1, "txtWurdeGeändert");
		tk.retrieveAllMessages();		
	}
```
Ausgabe:
	
	
	
	





```
10:33:09,033 ERROR BasicLazyInitializer: CGLIB Enhancement failed: hello.Message
java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V
	at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:118)
	at org.hibernate.proxy.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:41)
	at org.hibernate.tuple.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:161)
	at org.hibernate.tuple.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:131)
	at org.hibernate.tuple.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
	at org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:64)
	at org.hibernate.tuple.EntityMetamodel.<init>(EntityMetamodel.java:257)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:412)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:108)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:216)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1176)
	at hello.Testklasse.<init>(Testklasse.java:22)
	at hello.Testklasse.main(Testklasse.java:63)
10:33:09,063  WARN PojoEntityTuplizer: could not create proxy factory for:hello.Message
org.hibernate.HibernateException: CGLIB Enhancement failed: hello.Message
	at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:132)
	at org.hibernate.proxy.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:41)
	at org.hibernate.tuple.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:161)
	at org.hibernate.tuple.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:131)
	at org.hibernate.tuple.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
	at org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:64)
	at org.hibernate.tuple.EntityMetamodel.<init>(EntityMetamodel.java:257)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:412)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:108)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:216)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1176)
	at hello.Testklasse.<init>(Testklasse.java:22)
	at hello.Testklasse.main(Testklasse.java:63)
Caused by: java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V
	at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:118)
	... 13 more
Hibernate: select message0_.MESSAGE_ID as MESSAGE1_0_, message0_.MESSAGE_TEXT as MESSAGE2_0_, message0_.NEXT_MESSAGE_ID as NEXT3_0_, message0_.MESSAGE_SENDER as MESSAGE4_0_, message0_.MESSAGE_EMPFAENGER as MESSAGE5_0_, message0_.MESSAGE_ISUPDATED as MESSAGE6_0_ from MESSAGES message0_ order by message0_.MESSAGE_ID asc
4 message(s) found:
ID: 1	Text: ich werde geändert	Sender: einSender	Empfänger: einEmpf	isUpdated: false
ID: 2	Text: messageOhneSF	Sender: defaultSender	Empfänger: defaultEmpf	isUpdated: false
ID: 3	Text: Alles klar, Joe	Sender: Norman wars	Empfänger: Joe bekommts	isUpdated: false
ID: 4	Text: neueMsg	Sender: defaultSender	Empfänger: defaultEmpf	isUpdated: false


Hibernate: select message0_.MESSAGE_ID as MESSAGE1_0_0_, message0_.MESSAGE_TEXT as MESSAGE2_0_0_, message0_.NEXT_MESSAGE_ID as NEXT3_0_0_, message0_.MESSAGE_SENDER as MESSAGE4_0_0_, message0_.MESSAGE_EMPFAENGER as MESSAGE5_0_0_, message0_.MESSAGE_ISUPDATED as MESSAGE6_0_0_ from MESSAGES message0_ where message0_.MESSAGE_ID=?
Hibernate: update MESSAGES set MESSAGE_TEXT=?, NEXT_MESSAGE_ID=?, MESSAGE_SENDER=?, MESSAGE_EMPFAENGER=?, MESSAGE_ISUPDATED=? where MESSAGE_ID=?
Hibernate: select message0_.MESSAGE_ID as MESSAGE1_0_, message0_.MESSAGE_TEXT as MESSAGE2_0_, message0_.NEXT_MESSAGE_ID as NEXT3_0_, message0_.MESSAGE_SENDER as MESSAGE4_0_, message0_.MESSAGE_EMPFAENGER as MESSAGE5_0_, message0_.MESSAGE_ISUPDATED as MESSAGE6_0_ from MESSAGES message0_ order by message0_.MESSAGE_ID asc
4 message(s) found:
ID: 1	Text: txtWurdeGeändert	Sender: einSender	Empfänger: einEmpf	isUpdated: true
ID: 2	Text: messageOhneSF	Sender: defaultSender	Empfänger: defaultEmpf	isUpdated: false
ID: 3	Text: Alles klar, Joe	Sender: Norman wars	Empfänger: Joe bekommts	isUpdated: false
ID: 4	Text: neueMsg	Sender: defaultSender	Empfänger: defaultEmpf	isUpdated: false
```


----------



## norman (4. Apr 2006)

hmm....die fehler werden, wie ich jetzt bemerkt habe, von log4j ausgegeben.
heißt das, ich kann sie vernachlässigen? ???:L


----------

