2016-05-13 7 views
0

Wir haben vor kurzem migriert von Hibernate Suche nach 3.2.3, 3.2.2 Frühling Hibernate 4.3.11 und Spring 4.2.1 auf Weblogic 10.3Probleme mit Objekten abgefragt mit HQL oder Session-Filter in den Ruhezustand 4 + Spring 4 + JTA

Jetzt, wenn Hibernate-Objekte erstellt und der persistenten Sammlung eines Hibernate-Objekts hinzugefügt und später mit HQL (mithilfe von HibernateTemplate) oder Hibernates Funktion "Query" (in der gleichen Transaktion und vor dem Ende der Transaktion) abgefragt werden, schlägt Hibernate fehl finde die Objekte, die hinzugefügt wurden. Dies funktionierte vor der Aktualisierung mit Hibernate 3 und Spring 3, schlägt aber fehl.

z.B. In Psuedo Code, sagen wir, ich habe eine Bibliotheksklasse mit der folgenden Eigenschaft.

class Library{ 
    private Collection<Books> books; 
} 

In einer Transaktion, habe ich die folgenden -

... 
Book book1 = new Book(); 
book1.setAuthor("Patrick Holt"); 
library.getBooks().add(book1); 

und später in derselben Transaktion, Hibernate „Query“ mit einem Filter verwendet wird, wie dies durch den Autor für Bücher zu suchen

Session s = hibernateTemplate.getSessionFactory().getCurrentSession(); 
Query q = s.createFilter(library.getBooks(), "where this.author = :authorName"); 
q.setParameter("authorName", "Patrick Holt"); 
List l = q.list(); 

q.list() im obigen Beispiel gibt 0 Ergebnisse zurück. Dies würde 1 Ergebnis vor dem Upgrade zurückgeben. Nach dem Upgrade bekomme ich 0 Ergebnisse.

Ich habe einige Änderungen in currentSessionContext in Upgrades auf Hibernate 4 und Spring 4 gelesen, aber ich bin nicht sicher, was geändert werden muss, damit das Verhalten wie vor dem Upgrade funktioniert, ohne dass der Code geändert werden muss .

Out Hibernate Objekte sind in hbm.xml Dateien definiert und hier ist meine Konfiguration der Sitzungsfabrik.

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop> 
       <prop key="hibernate.cache.provider_configuration_file_resource_path">/WEB-INF/ehcache.xml</prop> 
       <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop> 
       <!-- 
       Tried adding the following properties, but it didn't work either 
       <prop key="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform</prop> 
       <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory</prop>--> 
      </props> 
     </property> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="mappingJarLocations"> 
      <list> 
       <value>/WEB-INF/lib/app-1.0.jar</value> 
      </list> 
     </property> 
    </bean> 

Transaction Manager Definition:

<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/> 

Die Datenquelle wird über jndi zur Verfügung gestellt.

Irgendwelche Ideen, was ich tun muss, um dieses Problem zu beheben?

+0

wenn Sie die 'library.getBooks(). Add (Buch1);' in Ihrem Beispiel. Ist Hibernate mit Auto-Flush konfiguriert? Kannst du zu diesem Zeitpunkt eine Einfügeabfrage sehen oder auf ein Commit für die gesamte Transaktion warten? Außerdem können Sie überprüfen, welche Entitäten sich im Cache befinden, denn selbst wenn Sie keine INSERT-Abfrage sehen, sollte sie zumindest im Cache der zweiten Ebene enthalten sein.Und eine letzte Frage, ich nehme an, dass Sie die 2 Operationen im selben Thread sequenziell machen? – AntJavaDev

+0

@AntJavaDev - Ich habe Hibernate nirgendwo explizit konfiguriert. Ich vermute, wenn in einer Transaktion der FlushMode AUTO ist. Ich habe sogar versucht, explizit den FlushMode auf die Abfrage zu setzen, um IMMER ohne Unterschied in den Ergebnissen zu sein. Dies ist ein Problem, auch wenn der Cache der zweiten Ebene deaktiviert wurde. Wenn Buch1 der Sammlung hinzugefügt wird, sehe ich keine Insert-Anweisung (Ich sehe eine Auswahl mit einem Join auf Bibliothek und Bücher - wahrscheinlich Bücher laden). Ja, beide Operationen sind im selben Thread und tatsächlich in der gleichen Klasse und in der gleichen Transaktion. – jazzkookie

+0

ok cool, nur ein einfacher Vorschlag, könnten Sie Ihre Select-Anweisung ändern und schreiben Sie eine einfache Auswahl nach ID (sieht aus wie AutorName ist kein Schlüssel), und nur zum Test, die ID der Entität, die Sie für die gleiche Transaktion erstellt haben . Auch wenn Sie sagen, dass Sie von Hibernate 3 auf 4 aktualisiert haben, haben Sie einfach Ihre Abhängigkeiten von Maven geändert, oder haben Sie andere Konfigurationsklassen als "LocalSessionFactoryBean" geändert; Überprüfen Sie diesen Beitrag es könnte nützlich sein http://koenserneels.blogspot.gr/2012/05/migrating-from-hibernate-3-to-4-with.html – AntJavaDev

Antwort

0

Das Problem, das ich hatte, ist genau wie in Spring Jira Issue SPR-13848 beschrieben. Wie ich es verstehe, scheint es so, als ob der OpenSessionInViewFilter eine Anforderungsbereichs-Sitzung früh öffnet und es Probleme mit der Synchronisierung einer Transaktion gibt, die später gestartet wird.

Ich konnte mein OSIV nicht loswerden wegen der Auswirkungen, die es während meiner Anwendung verursachen würde. Allerdings fand ich heraus, dass Hibernate eine Eigenschaft hat, dass etwas Ähnliches erreichen wird verzögertes Laden zu verhindern -

<prop key="hibernate.enable_lazy_load_no_trans">true</prop> 

dies das Problem gelöst. Durch das Hinzufügen dieser Eigenschaft konnte ich das OSIV entfernen, und der AUTO-Flush-Modus im Ruhezustand funktioniert jetzt wie erwartet in einer Transaktion. Ich habe auch die CMTTransactionFactory verwendet. Alle meine Ruhezustand Eigenschaften:

Verwandte Themen