associate collection with two open sessions

K

kdkkdkddkdkkd

Gast
Hallo!

Ich habe ein großes Problem: Ich programmiere eine Konsolenanwendung mit Spring und AOP. Derzeit versuche ich (testweise) auf eine Datenbank zuzugreifen, ein Element abzuholen und dies wieder zu speichern, um zu sehen ob das Transaktionsmanagement funkioniert. Leider bekomme ich aber folgenden Error:
[WR]Exception in thread "main" org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
[/WR]

Dieser Fehler tritt auf bei der UserDaoImpl.saveOrUpdate(u);

Hier meine konfiguration:
Java:
		NewsletterDao ndao = (NewsletterDao) applicationContext.getBean("newsletterDao");
		ndao.saveOrUpdate(ndao.getNewsletterById(0)); //Funktioniert
		Newsletter nltr = ndao.getNewsletterById(0);
		Mandant mandant = nltr.getMandant();
		
		UserDao ud = (UserDao) applicationContext.getBean("userDao");
		User u = ud.getUserByEmail(mandant, "email@email.email");
		System.out.println(u.getAddress());
		ud.saveOrUpdate(u); // HIER FEHLERMELDUNG

UserDaoImpl.
Java:
public void saveOrUpdate(User user) {
		if (user.getAddress().getEmail() == null) {
			user.getAddress().setEmail(user.getEmail());
		}
		getSession().saveOrUpdate(user);
		getSession().saveOrUpdate(user.getAddress());
	}

ApplicationContext
[XML]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
Index of /schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
Index of /schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
Index of /schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd
">

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="shopSessionFactory" />
</bean>

<bean id="localDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url"
value="jdbc:postgresql://localhost:******" />
<property name="username" value="***" />
<property name="password" value="***" />
</bean>

<bean id="shopSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="localDataSource" />
<property name="mappingResources" ref="shopMappingResources" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>

<tx:advice id="txShopAdvise" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get**" propagation="SUPPORTS" read-only="true" />
<tx:method name="save**" propagation="REQUIRED" />
<tx:method name="delete**" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="daoShopTransaction"
expression="execution(* dao.*Dao.*(..))" />
<aop:advisor advice-ref="txShopAdvise" pointcut-ref="daoShopTransaction" />
</aop:config>

<!-- DAO Shop -->

<bean id="userDao" class="dao.UserDaoImpl">
<property name="sessionFactory" ref="shopSessionFactory" />
</bean>

<bean id="newsletterDao" class="dao.NewsletterDaoImpl">
<property name="sessionFactory" ref="shopSessionFactory" />
</bean>
<bean id="newsletterFailedReasonTypeDao"
class="dao.NewsletterFailedReasonTypeDaoImpl">
<property name="sessionFactory" ref="shopSessionFactory" />
</bean>
<bean id="newsletterFailedReasonDao"
class="dao.NewsletterFailedReasonDaoImpl">
<property name="sessionFactory" ref="shopSessionFactory" />
</bean>

<bean id="shopMappingResources" class="java.util.ArrayList">
<constructor-arg>
<list>
.....
</list>
</constructor-arg>
</bean>
</beans>
[/XML]

Ich suche den Fehler nun schon seit 2 Tagen, schön langsam bin ich am Verzweifeln. Wäre echt toll wenn mir jemand sagen könnte, was ich falsch mache :O

Schönen Tag noch
 
M

maki

Gast
Der Fehler sagt aus, dass du versuchst eine Colelction in 2 Sessions zu verwalten.

Du musst entweder dieselbe Session weiterverwenden (im Falle von eine langlebigen Transaktion) oder eben die erste Session schliessen bevor die Colelciton in der 2. Session verwendet wird.
 
K

kdkkdkddkdkkd

Gast
dass das die Fehlermeldung aussagt verstehe ich schon, nur weiß ich nicht wie ich die vorherige Session schließen soll, sie wird ja von aop verwaltet. Das verstehe ich nicht so ganz
 
S

SlaterB

Gast
was steht eigentllich in getUserByEmail()?
ist ja anscheinend die einzige weitere interessante Methode, kommt das mandant-Objekt irgendwie rein?

was passiert wenn du den Code von saveOrUpdate(User user) gleich in die getUserByEmail() reinkopierst,
dort dann auch direkt Exception?

macht es einen Unterschied wenn du auf anscheinend mindestens 3x getSession() verzichtest, nur 1x getSession aufrufst
und die Session in einer lokalen Variable ablegst und wiederverwendest?
 
K

kdkkdkddkdkkd

Gast
Hallo!

in getUserByEmail steht:
Java:
public User getUserByLogin(Mandant mandant, String login) {
		User user = null;
		if (mandant != null) {
			String userlogin = login.trim().toLowerCase();
			user = (User)getSession().createQuery("from User u left join fetch u.addresses a where lower(ltrim(rtrim( u.login ))) = :login and u.mandant.id=:mand_id").setParameter("mand_id", mandant.getId()).setParameter("login", userlogin).uniqueResult();
		}
		return user;
	}

wenn ich den saveOrUpdate code in die getUserByEmail reinkopiere erhalte ich den gleichen Fehler.

Wie hast du die letzte Methode gemeint? Im Dao oben Session s = getSession(); aufrufen und mit s weiterarbeiten? Das gibt einen nullpointer :/
 
S

SlaterB

Gast
na du benutzt doch getSession() reichlich, dann müsste es da ja auch Nullpointer geben,
natürlich nicht ganz zu Beginn aufrufen, sondern in der Methode, wenn sowieso verwendet, aber nur einmal statt mehrmals

ich frage mich ob nur einmal getSession() hilft, dass alles zusammenarbeitet,
wenn ja oder nein, richtig was draus ablesen kann ich eher nicht

noch so eine komische Frage:
wenn du die Session in einer Variablen gespeichert hast,
bringt es etwas, vor dem Laden mit clear() den Cache der Session zu leeren?
 
K

kdkkdkddkdkkd

Gast
blöde frage, aber ich benutz doch getSession() in den Daos. Aufgerufen wird das ganze im Main, wenn ich in der Funkion im Main eine Sessionvariable erstelle bringt mir das doch nichts, da die Daos ja uf die Session zugreifen die ich per AOP erstellt habe?!

oder verstehe ich das jetzt irgendwie falsch?
 
S

SlaterB

Gast
'in der Funkion im Main' ist ziemlich ungenau, da weiß ich nicht was du meinst,

ganz klar sind drei Stellen bekannt: die Methode getUserByEmail(), die Methode saveOrUpdate(User) + der Aufrufer dieser beiden, meinetwegen 'main',
dass du den Code von saveOrUpdate(User) nach getUserByEmail() (für diesen Test) kopieren solltest, habe ich gesagt und hast du verstanden,

nun gibt es die 'main', die lediglich die Methode aufruf, und getUserByEmail(), in welcher 3x getSession() steht,
und ich schlage weiter vor, diese drei Aufrufe durch eine lokale Variable zu ersetzen,
jetzt kommst du auf die Idee, in 'main' getSession() aufzurufen? wo diese Methode wahrscheinlich gar nicht definiert ist?
mir unverständlich, natürlich meine ich innerhalb der Methode getUserByEmail(), da wo der ganze Code steht um den es geht..

dort steht
Java:
getSession().query()
getSession().saveOrUpdate(user);
getSession().saveOrUpdate(user.getAddress());
usw., außerdem hast du eine Fehlermeldung 'two open sessions',
es ist doch naheliegend, das mal nur mit garantiert einem Session-Objekt zu probieren

höchstwahrscheinlich bringt das absolut nichts, hätte ich nicht noch anderes zu posten gehabt hätte ich das gar nicht erst gefragt,
die ganzen Rückfragen und Ausbreitung des Themas sind mir unangenehm, denn es wird wohl zu nichts führen ;)
 
K

kdkkdkddkdkkd

Gast
Entschuldige, ich glaube wir haben etwas aneinander vorbei geredet...

Ich versuche es nochmal zu erklären:

Es handelt sich um eine Konsolenanwendung, im Main wird eine Methode aufgerufen (public static void writeValidation()), welche zum einen die Daos vom ApplicationContext holt (Code-Snippet aus dem ersten Post) und dann über diese Daos einen User holt, den dann auch wieder Speichert (zu Testzwecken).

Wie schon erwähnt habe ich per Spring die sessionFactory in jede DaoBean injected (um im Dao mit getSession().* arbeiten zu können) und per AOP habe ich das Transectionmanagement realisiert (Transaction immer bei get**, save**, delete**).

Entschuldige falls ich deinen Post falsch verstanden haben sollte, aber ich bin durch die ganze Fehlersucherei schon etwas verwirrt.

Hoffe ihr könnt mir trotzdem noch helfen
 
K

kdkkdkddkdkkd

Gast
Ein kleines Update meinerseits:

funktioniert nun, ich habe (wie SlaterB gesagt hat) in der UserDao die Session zu beginn in eine Variable gespeichert und statt dauernd getSession() aufzurufen immer diese Variable verwendet.
Ein weiteres Problem das ich etndeckt habe ist, dass erst in die DB geschrieben wird, wenn ich ein beginTransaction() und ein commit() hinzufüge. Das zeigt doch meines erachtens klar, dass bei der config von AOP, speziell beim TransactionManager, etwas nicht in Ordnung ist?!

Liebe Grüße
 
S

SlaterB

Gast
das mit den unterschiedlichen Sessions sehe ich kritisch, auch wenn ich trotz der Idee nicht viel mehr dazu sagen kann,

die Abhängigkeit von der Transaktion kenne ich so auch aus Hibernate, ist für mich ok, einfach dran halten
 
K

kdkkdkddkdkkd

Gast
hab nun auch das Problem mit den Transaktionen beseitigt (mit der Annotation @Transactional).

Nun bleibt nur mehr das problem mit den Sessions. Was mich wundert ist der Fakt, dass ich das eigentlich immer so gemacht habe in den Daos mit getSessio(),saveOrUpdate(..) und es hat eigentlich nie den Fehler mit den multiple Sessions geworfen :O
 
K

kdkkdkddkdkkd

Gast
Hallo!
Hab das Problem gelöst. Für alle die den selben Fehler haben hier meine Fehlerquelle:

Der Fehler lag grundsätzlich in den Mappings. Im PoJo wurde die Spalte ID mit integer initialisiert, im hbm.xml aber mit long (dürfte ein Fehler beim reverse-engineering passiert sein). Was mich wundert ist, dass Eclipse das nicht angezeigt hat. Nichtsdestotrotz, nach ausbessern dieser Ungleichheiten funktioniert es.

Kann nun auf Erledigt gesetzt werden. Danke!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java certified Associate Programmer Allgemeine Java-Themen 2
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
W Collections Suche Collection, um Strings mit Indizees versehen Allgemeine Java-Themen 47
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
Y String-Collection: längste gemeinsame Strings / Prefixe Allgemeine Java-Themen 3
S Probleme mit Collection Allgemeine Java-Themen 7
S Passende Java Collection Allgemeine Java-Themen 5
D Eigene/r Collection/Container Allgemeine Java-Themen 3
K Collections Collection<> mit List<String> abgleichen? Allgemeine Java-Themen 10
D Beste Collection für Integer Allgemeine Java-Themen 4
H JPA (EclipseLink) Neuer Eintrag in Collection speichern (unidirektional) Allgemeine Java-Themen 3
M Collections Typ Variable einer generischen Collection ? Allgemeine Java-Themen 4
T Garbage Collection Frage Allgemeine Java-Themen 15
H Datentypen Collection für SQL-Datentypen Allgemeine Java-Themen 2
M collection persistence system Allgemeine Java-Themen 4
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
S Stilfrage bezüglich Beans mit Collection-Properties Allgemeine Java-Themen 2
B iText Portable Collection Acrobat X Allgemeine Java-Themen 2
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
Rudolf Aus Collection<Integer> eine Zahl machen Allgemeine Java-Themen 2
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
hdi Garbage Collection Allgemeine Java-Themen 12
P Collection Tree Allgemeine Java-Themen 19
C Die schnellste Collection-Klasse ? Allgemeine Java-Themen 37
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
E Collection Problem Allgemeine Java-Themen 2
B Geordnete, begrenzte Collection Allgemeine Java-Themen 3
D [SOLVED] Collection wird nicht richtig per Konstruktor übernommen Allgemeine Java-Themen 8
S Wahl der Collection, unspezifizierte Elementtypen Allgemeine Java-Themen 4
D Map mit Collection Eigenschaften Allgemeine Java-Themen 9
T Objekt der Garbage Collection zugaenglich machen? Allgemeine Java-Themen 7
S Innerer Type einer generischen Collection herausfinden? Allgemeine Java-Themen 13
B SBCC - Swing Better Components Collection - downloadlink ? Allgemeine Java-Themen 5
G Schnelligkeit einer Collection Allgemeine Java-Themen 12
V Collection in Collection Allgemeine Java-Themen 3
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
M Collection aufteilen Allgemeine Java-Themen 4
S Collection Type Allgemeine Java-Themen 8
S Probleme mit collection.containsAll Allgemeine Java-Themen 28
F Frage zu Memory Leak, Garbage Collection und Profiler-Tools Allgemeine Java-Themen 6
C Collection Multithreading? Allgemeine Java-Themen 33
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
T Hibernate Criteria Queries - Abfragen von Collection-Members Allgemeine Java-Themen 2
M Schnellste Collection/Liste Allgemeine Java-Themen 15
M Collection mit ArrayList Allgemeine Java-Themen 17
F mittels Collection<A> an A.class kommen? Allgemeine Java-Themen 7
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
B Collection Allgemeine Java-Themen 2
M Wie lange dauert ein garbage collection Allgemeine Java-Themen 7
R Garbage Collection bei gegenseitiger Objektreferenz Allgemeine Java-Themen 2
N Collection#retainAll(Collection<?> c) Allgemeine Java-Themen 3
M garbage collection Allgemeine Java-Themen 14
G Frage zur Garbage Collection Allgemeine Java-Themen 5
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
J Von Collection zu vector Allgemeine Java-Themen 5
P Welche Collection verwenden? Allgemeine Java-Themen 4
S Sortierung einer Collection nach dem Attribut "name&quo Allgemeine Java-Themen 3
C Collection Element ersetzen Allgemeine Java-Themen 5
C public boolean containsAll(Collection c) Allgemeine Java-Themen 2
C Collection, LinkedList, Elemente Allgemeine Java-Themen 4
D Open Source Library zum erstellen von PDFs Allgemeine Java-Themen 1
C Microsoft unterstützt Open JDK Allgemeine Java-Themen 7
ms_cikar JavaOSC (Open Sound Control) Allgemeine Java-Themen 1
Neumi5694 Desktop.getDesktop().open(...); Allgemeine Java-Themen 0
M Umstieg Oracle JDK zu Open JDK Allgemeine Java-Themen 20
E Open Declaration Funktioniert nicht Allgemeine Java-Themen 0
J Druckvorgang mit Java beenden (Open Office) Allgemeine Java-Themen 3
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
M Open Source Projekte => wo herunterladen? Allgemeine Java-Themen 2
M Open Source Projekte / source - binaries Allgemeine Java-Themen 13
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
N GPIB - Fehler: Unable to open device Allgemeine Java-Themen 1
G Desktop open() - Problem mit Media Player Allgemeine Java-Themen 4
C Open Soure Projekte für parallele Programmierung Allgemeine Java-Themen 6
A Open Office Formeln Allgemeine Java-Themen 7
D Ersetzen in Open Office Dokument Allgemeine Java-Themen 2
A External Sort - too many open files Allgemeine Java-Themen 6
KrokoDiehl Desktop.open() und warten? Allgemeine Java-Themen 3
1 Java <-> Open Office Allgemeine Java-Themen 5
C Desktop.mail Problem. IO Exception: Failed to open. Allgemeine Java-Themen 3
J Open Source Projekt anbieten - Leitfaden gesucht Allgemeine Java-Themen 3
T linux problem mit Desktop.getDesktop().open(..) Allgemeine Java-Themen 5
M bug? datei oeffnen nicht Desktop.open Allgemeine Java-Themen 3
V Probleme mit Desktop.open() ? Allgemeine Java-Themen 7
Daniel_L Fehler in Desktop.getDesktop().open()? Allgemeine Java-Themen 3
J Too many open files Allgemeine Java-Themen 11
Daniel_L Desktop-Api: Problem mit open() und Umlauten Allgemeine Java-Themen 5
V Probleme mit Desktop.open() ? Allgemeine Java-Themen 4
J Too many files open Allgemeine Java-Themen 4
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
K "Too many open files" bei Property List Allgemeine Java-Themen 5
MasterEvil Open Office Converter Allgemeine Java-Themen 11
Y Open Source Plattformen Allgemeine Java-Themen 4
C [javax.mail] Folder not open Allgemeine Java-Themen 2
L Open Source Projekt Allgemeine Java-Themen 7
S Runtime exec unter MacOS X will nicht "open pfad" Allgemeine Java-Themen 7
M Runtime.exec() => java.io.exception: too many open files Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben