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:
und wann tritt der auf? ==> Zeile 54
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
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:
Code:
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
Code:
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