Hallo.
Ich habe ein paar Verständnisprobleme bei unten angegebenem Code.
Und zwar bekomme ich eine "org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [ValidationObject#149]",
obwohl ich ja eigentlich zwischen den beiden (völlig voneinander getrennten) Sessions hingehe und explizit die Id ändere (welche auch wirklich als identifier für Hibernate spezifiziert ist).
An Hand welcher Kriterien erkennt denn Hibernate, daß das wirklich ein (auch in einer anderen Session) schon gespeichertes Object ist?
An Hand der Id alleine ja anscheinend nicht.
Irgendwelche besonderen Optionen habe ich auch nicht angegeben (wobei ich dazu sagen muss, daß ich Eclipse Teneo fürs Mapping verwende).
Gruß,
Tanjy
Code:
ValidationProject project = ValidationProjectModelFactory.eINSTANCE.createValidationProject();
ValidationPipeline pipe = ValidationProjectModelFactory.eINSTANCE.createValidationPipeline();
project.setPipeline(pipe);
ValidationObject obj = ValidationProjectModelFactory.eINSTANCE.createValidationObject();
pipe.getObjects().add(obj);
{
DatabaseManager databaseManager = DatabaseManager.getInstance();
Session session = databaseManager.openTeneoSession();
Transaction tx = null;
try {
if (session == null)
throw new HibernateException("Can't establish connection to PubCurator database.");
tx = session.getTransaction();
tx.begin();
Long id = (Long) session.save(project);
System.out.println(id);
tx.commit();
}
catch(HibernateException e) {
if (tx != null && tx.isActive())
tx.rollback();
throw e;
}
finally {
if (session != null && session.isOpen())
session.close();
}
}
obj.setId(0);
{
DatabaseManager databaseManager = DatabaseManager.getInstance();
Session session = databaseManager.openTeneoSession();
Transaction tx = null;
try {
session.clear();
session.flush();
if (session == null)
throw new HibernateException("Can't establish connection to PubCurator database.");
tx = session.getTransaction();
tx.begin();
ValidationPipeline pipe2 = (ValidationPipeline) session.load("ValidationPipeline", pipe.getId());
pipe2.getObjects().add(obj);
session.flush();
tx.commit();
}
catch(HibernateException e) {
if (tx != null && tx.isActive())
tx.rollback();
throw e;
}
finally {
if (session != null && session.isOpen())
session.close();
}
}