hallo,
ich versuche derzeit eine speichern/laden funktion für ein Eclipse EMF projekt mit hilfe von Teneo/Hibernate zu implementieren, hab aber das eine oder andere problem damit.
an sich funktioniert speichern sowie laden, solange man nicht versucht das selbe modell zwei mal zu speichern bzw es zu aktualisieren.
sprich,
modell erzeugen, speichern, modell erzeugen, speichern, ... -> lade klappt
modell erzeugen, speichern, speichern -> klappt nicht
laden -> speichern -> klappt nicht
ich hoff das ist ein ganz einfacher fehler und ich bin nur zu blöd ihn zu sehen ;)
danke schön für die geduld :)
Hibernate version: 3.2.6
Name and version of the database: HSQLDB 1.8.0.9
Code:
die save method:
Code:
public static boolean doSaveToDB(String fileName, HbDataStore hbds)
{
if (!session.isOpen())
{
session = sessionFactory.openSession();
session.setFlushMode(FlushMode.MANUAL);
tx = session.getTransaction();
}
tx.begin();
try
{
session.saveOrUpdate(editingDomain.getResourceSet().getResources().get(0).getContents().get(0));
} catch (HibernateException e)
{
e.printStackTrace();
}
session.flush();
tx.commit();
if (session.isOpen())
{
session.clear();
session.close();
}
return true;
}
die load method:
Code:
public static Modell loadExistingModellFromDB(String fileName, HbDataStore hbds)
{
if (!session.isOpen())
{
session = sessionFactory.openSession();
session.setFlushMode(FlushMode.MANUAL);
tx = session.getTransaction();
}
URI resourceURI = URI.createURI("hbxml://?dsname=" + fileName);
Modell model = null;
tx.begin();
try
{
try
{
editingDomain.getResourceSet().getResources().get(0).load(Collections.EMPTY_MAP);
} catch (IOException e)
{
e.printStackTrace();
}
BigInteger fileID = new BigInteger(fileName);
BigInteger ID = null;
try
{
for (int i = 0; !fileID.equals(ID) || (fileID.compareTo(ID) < 0) ; i++)
{
editingDomain.getResourceSet().getResources().clear();
editingDomain.getResourceSet().createResource(resourceURI);
editingDomain.getResourceSet().getResource(resourceURI, true);
model = (Modell) editingDomain.getResourceSet().getResources().get(0).getContents().get(i);
List models = session.createSQLQuery("SELECT E_ID FROM \"modell\"").list();
ID = (BigInteger) models.get(i);
}
} catch (RuntimeException e)
{
System.err.println("No entry found!");
}
} catch (HibernateException e)
{
e.printStackTrace();
} catch (RuntimeException re)
{
re.printStackTrace();
}
session.flush();
tx.commit();
if (session.isOpen())
{
try
{
session.clear();
session.close();
} catch (HibernateException e)
{
System.err.println("Session closing failed");
e.printStackTrace();
}
}
return model;
}
und die initialisirungsmethode für den HbDataStore
Code:
public static HbDataStore initializeDataStore(String fileName)
{
final HbDataStore hbds = (HbDataStore) HbHelper.INSTANCE.createRegisterDataStore(fileName);
final EPackage[] ePackages = new EPackage[] { EcupackPackage.eINSTANCE };
hbds.setEPackages(ePackages);
final Properties props = new Properties(); // the database settings
try
{
props.setProperty(Environment.DRIVER, "org.hsqldb.jdbcDriver");
props.setProperty(Environment.URL, "jdbc:hsqldb:hsql://127.0.0.1/" + "ECUall");
props.setProperty(Environment.USER, "sa");
props.setProperty(Environment.PASS, "");
props.setProperty(Environment.DIALECT, "org.hibernate.dialect.HSQLDialect");
props.setProperty(Environment.HBM2DDL_AUTO, "update");
props.setProperty(Environment.CACHE_PROVIDER, "org.hibernate.cache.HashtableCacheProvider");
props.setProperty(Environment.AUTOCOMMIT, "false");
hbds.setProperties(props);
} catch (RuntimeException e1)
{
e1.printStackTrace();
}
try
{
hbds.initialize();
} catch (RuntimeException e)
{
e.printStackTrace();
}
return hbds;
}
die kompletten Stacktraces der auftretenden Exceptions: der stacktrace der auftritt wenn man läd und anschließend speichert:
Code:
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.engine.Cascade.cascade(Cascade.java:97)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:357)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:329)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
at teneoRuntime.TeneoRuntimeLayer.doSaveToDB(TeneoRuntimeLayer.java:398)
at teneoRuntime.TeneoRuntimeLayer.main(TeneoRuntimeLayer.java:227)
Exception in thread "main" org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:131)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:122)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at teneoRuntime.TeneoRuntimeLayer.doSaveToDB(TeneoRuntimeLayer.java:421)
at teneoRuntime.TeneoRuntimeLayer.main(TeneoRuntimeLayer.java:227)
der stacktrace der auftritt, wenn man zwei mal hintereinander speichert:
Code:
org.hibernate.HibernateException: Don't change the reference to a collection with cascade="all-delete-orphan": PortTypeContainer.contents
at org.hibernate.engine.Collections.prepareCollectionForUpdate(Collections.java:226)
at org.hibernate.engine.Collections.processReachableCollection(Collections.java:185)
at org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:37)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:138)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at teneoRuntime.TeneoRuntimeLayer.doSaveToDB(TeneoRuntimeLayer.java:436)
at teneoRuntime.TeneoRuntimeLayer.main(TeneoRuntimeLayer.java:235)