Sämtliche mit @ManyToMany annotierten Felder meiner Klassen verursachen zur Laufzeit
HibernateExceptions mit der folgenden Fehlermeldung:
Quote:
Found shared references to a collection: path.to.package.ClassName.fieldName
Weitere Details siehe unten. Es sei noch zu sagen, dass diese Fehler bei Aufrufen von
Query.uniqueResult() bzw.
Query.list() auftreten; allerdings nicht immer, sondern so unregelmäßig ähnlich wie typische Race Conditions.
Hibernate version:
Hibernate 3.2 GA (Core und Annotations)
Mapping documents:
Auf Nachfrage kann ich detaillierte Informationen freigeben, allerdings ist für dieses Problem die Hibernate-Konfig.-XML (hibernate.cfg.xml) uninteressant. Die Klassen werden über Annotations beschrieben.
Code between sessionFactory.openSession() and session.close():
Da ich verschiedene Klassen für die Kapselung und Abstraktion des Hibernate-API entworfen habe, kann ich dies nicht genau dokumentieren. Allerdings hier ein Beispiel für die Methode, in der ein solcher Fehler auftritt:
Code:
Contact c = (Contact) (HibUtils.currentSession()
.createQuery("from Contact where contactProfile is not null and contactProfile.name = :cp")
.setParameter("cp", OPERATOR_PROFILE).uniqueResult());
if (c == null) { /* neu anlegen */ } else return c;
Full stack trace of any exception that occurs:HibernateException: Found shared references to a collection: de.XYZ.Contact.attachments
at org.hibernate.engine.Collections.processReachableCollection()
at org.hibernate.event.def.FlushVisitor.processCollection()
at org.hibernate.event.def.AbstractVisitor.processValue()
at org.hibernate.event.def.AbstractVisitor.processValue()
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues()
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity()
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities()
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions()
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush()
at org.hibernate.impl.SessionImpl.autoFlushIfRequired()
at org.hibernate.impl.SessionImpl.list()
at org.hibernate.impl.QueryImpl.list()
at org.hibernate.impl.AbstractQueryImpl.uniqueResult()
at de.XYZ.backend.BackEndGUI.getOperator(BackEndGUI.java:3782)
at de.XYZ.backend.BackEndGUI.getEMailInfo(BackEndGUI.java:5198)
at ... // weitere Methoden innerhalb der AWT/Swing-EventQueue
Name and version of the database you are using:MySQL 5.0.67-community-nt (DB: v5.0) via
JDBC v3.0MySQL-AB JDBC Driver: mysql-connector-java-5.0.7 ( $Date: 2007-03-09 22:13:57 +0100 (Fri, 09 Mar 2007) $, $Revision: 6341 $ )
The generated SQL (show_sql=true):Auszug der mysqlqueries.log (MySQL-Abfragen-Protokolldatei)
Hinweis: es wurden SQL-SELECT-Statements für vollkommen unabhängige Tabellen/Klassen herausgekürzt sowie die ewig lange Liste von SELECT-Feldern.
Debug level Hibernate log excerpt:Ist jetzt nicht möglich, da ich selbst Log4j-Logausgaben mache.
Declaration of class and fieldCode:
@Entity public class Contact {
...
private List<Document> attachments;
@ManyToMany(fetch = FetchType.LAZY)
public List<Document> getAttachments() { return attachments==null ? new ArrayList<Document>() : attachments; }
public void setAttachments(List<Document> attachments) {
this.attachments = attachments==null ? new ArrayList<Document>() : attachments;
Log.debugInfo(getEntityManager().getObjectType(), "(", getEntityManager().getObjectID(this), ").attachements=", this.attachments);
}
}
Vielen Dank für Hinweise zur korrekten Konfiguration von @ManyToMany-Feldern.