Wie konfiguriert man die Sitzung in Hibernate 4.3.4.Final?

8

Ich habe kürzlich die Version meines Hibernate auf 4.3.4.Final aktualisiert. Basierend auf der Contextual Sessions-Konfiguration von Hibernate ist diese neue Version nicht verfügbar basierend auf ThreadLocal mehr. Wenn ich was bisher erreicht habe, muss ich etwas tun, um es effizienter zu machen? wenn es falsch ist, was soll ich tun? Ich habe keine Ahnung.

Beachten Sie, wird in der Dokumentation erwähnt, dass: Hibernate drei Methoden des aktuellen Sitzungs-Trackings bietet. Das "thread" -basierte Verfahren ist nicht für den produktiven Einsatz gedacht; es ist nur nützlich für Prototyping und Tutorials wie dieses.

Hibernate.cfg.xml

%Vor%

Aktuelle Konfiguration und Code

Basierend auf Antworten blies und dieser Teil der Dokumentation mu aktuelle Konfiguration ist wie Folgendes:

%Vor%

Und der Code wäre wie folgt

%Vor%

Vorherige Konfiguration und Code

%Vor%

Code zum Zugriff auf Transaktionen und zum Senden von Befehlen

%Vor%     
Jack 14.05.2014, 05:35
quelle

2 Antworten

3

Ich würde die TreadUtil-Klasse löschen, die mich an den Integrationsstil Spring 1.0 Hibernate erinnert. Wenn Sie vorhaben, zu Hibernate 4 zu wechseln.

Neben der Tatsache, dass Sie sich auf Hibernate 4 verlassen sollten bootstrap -Mechanismus, hat Ihr Code auch die folgenden Probleme:

  1. Der Neuaufbau der Sitzungsfactory ist nicht synchronisiert

    %Vor%
  2. Ich sehe nicht, warum Sie es neu erstellen müssen, da Sie es niemals auf null setzen, da die Sitzungsfactory als statischer Block initialisiert wird.

Wenn Sie Ihren Hibernate-Code immer in die HibernateUtil.openSession () try / finally-Blöcke schreiben müssen, würden Sie eine Menge von Sitzungsverwaltungslogik kopieren, während Sie die Geschäftslogik mit der Transaktionslogik mischen. Dies bricht das Prinzip der einheitlichen Verantwortung.

Wenn Sie HibernateUtil immer noch nicht loslassen wollen, können Sie zumindest einen ähnlichen Mechanismus wie JDBCTemplate , um die Sitzungs- / Transaktionsverwaltung in einer Schablonemethode zu abstrahieren, während der Geschäftscode in einem Callable bereitgestellt wird, das für Sie folgendermaßen aussieht:

%Vor%

Wenn Sie sich Ihren Code ansehen, möchten Sie, dass Sie lokale JDBC-Ressourcentransaktionen mit dem Zugriffsidiom "Sitzung pro Anfrage" wünschen, was bedeutet, dass Sie den ThreadLocalSessionContext:

benötigen %Vor%

Extra

Sie könnten auch in JPA wechseln und die Hibernate-Eigenschaften in persistence.xml verschieben.

    
Vlad Mihalcea 19.05.2014 07:05
quelle
2

Der Zugriff auf eine einzige Instanz von SessionFactory innerhalb Ihrer Anwendung ist alles was benötigt wird.

Die folgenden Informationen sind alle (verfügbar) in den manuellen Kapiteln von Hibernate 4.3 2.2. Kontext-Sitzungen und 13. Transaktionen und Parallelität .

"A SessionFactory ist ein teuer zu erstellendes, threadsicheres Objekt, das von allen Anwendungsthreads gemeinsam genutzt werden soll. Es wird einmal, normalerweise beim Start der Anwendung, von einer Konfigurationsinstanz erstellt."
"A Sitzung ist ein kostengünstiges, nicht threadsicheres Objekt, das einmal verwendet und dann verworfen werden sollte für: eine einzelne Anfrage, eine Konversation oder eine einzelne Arbeitseinheit."

Wenn es keine "Arbeitseinheit" gibt, sondern nur eine Menge (gebündelter) Abfragen und Aktualisierungen, folgen Sie einfach dem ersten Idiom für die nicht-verwaltete Umgebung (aus Kapitel 13 bereits erwähnt). Und wenn Sie nicht zeigen können, dass dies zu Leistungsproblemen führt (*), versuchen Sie nicht zu optimieren, denn das ist die Wurzel allen Übels .

Wenn es eine "Arbeitseinheit" oder "Sitzung-pro-Anfrage" gibt, kann die HibernateUtil aus der Frage durch die Verwendung von org.hibernate.context.internal.ThreadLocalSessionContext als CurrentSessionContext ersetzt werden (siehe Kapitel 2.2) und nach der zweites Idiom für die nicht verwaltete Umgebung .

Wenn Sie JTA verwenden, ersetzen Sie ThreadLocalSessionContext durch org.hibernate.context.internal.JTASessionContext und folgen Sie den in Verwenden von JTA .

Beachten Sie das Kapitel, das die "Arbeitseinheit" beschreibt: Eine gute Architektur für Ihre Software hängt davon ab, was ein "Geschäftsvorgang" und "Anwendungsvorgang" für Ihre Anwendung bedeutet.

(*) Leistungsprobleme können durch Konfigurationsprobleme verursacht werden, z. diese Frage mit der zugehörigen Dokumentation hier im Hibernate-Handbuch.

    
vanOekel 18.05.2014 16:05
quelle