Was ist der Unterschied zwischen withTransaction und withSession in grails?
Ich weiß, bekommt man die zugrunde liegende session und der andere eine Referenz auf die aktuelle Transaktion den status; jedoch, was sind die Unterschiede zwischen Ihnen und was wäre ein Beispiel use-case für jeden?
Meine Forderung ist, um batch-speichern Sie einige Datensätze in einer Service-Methode block.
Du musst angemeldet sein, um einen Kommentar abzugeben.
withTransaction
ist ein bisschen hackish, weil es Ihnen erlaubt zu tun, Transaktions-überall arbeiten, aber es ist am besten zu trennen, Ihre Anliegen und die Arbeit in einem Transaktions-service. Ein service transactional standardmäßig, es sei denn, Sie fügenstatic transactional = false
und können fein abgestimmt werden auf die Klasse und/oder die Methode mit der Ebene@Transactional
annotation. Sie sollten in Ordnung sein, nur darum, Ihren code in einer service-Methode ohne VerwendungwithTransaction
oderwithSession
.withSession
ist ein bequemer Weg, um Zugang zu den aktuellen HibernateSession
(in der Regel registriert durch die OpenSessionInView interceptor). Wenn Sie möchten, deaktivieren Sie die Sitzung oder machen andere Arbeit, die nicht gemacht werden, GORM, dies ist ein Weg, um darauf zuzugreifen, ohne Zugriff auf diesessionFactory
oder den lokalen thread-Inhaber, dass der Frühling verwendet.Eine einigermaßen gültige Verwendung von
withTransaction
außerhalb der Transaktions-service-Methode zum binden eines HibernateSession
wenn Sie außerhalb der controller-Anfrage (d.h., wenn es keine automatisch erstelltenSession
).withTransaction
wird eine Transaktion starten, und erstellen Sie eineSession
wenn nötig, und halten Sie offen für die Dauer der Schließung. So können Sie es verwenden, um zu vermeiden, lazy loading exceptions. Wir brauchen einen anderen Weg, dies zu tun, ohne den Aufwand einer Transaktion, für jene Fälle, wenn Sie nur aus der Datenbank Lesen und brauchen nicht transaktionalen schreibt. Aber jetzt, dieses Konzept funktioniert. Wenn Sie jedoch die Datenbank schreibt, verschieben Sie den code, um eine service-Methode.withSession
Verknüpfung, wie der AufrufsessionFactory.getCurrentSession().clear()
war immer mühsam.withTransaction
ist nicht der einzig richtige Weg, dies zu tun. Verwenden Sie einfachTransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
Sitzung und TransactionStatus sind zwei völlig verschiedene Dinge. Die Sitzung ist eine Abstraktion, die gibt Ihnen Zugang zu allen die hibernate-Funktionalität, während die TransactionStatus-kann verwendet werden, um die aktuelle Transaktion.
withSession
können verwendet werden, wenn Sie benötigen direkten Zugriff auf hibernate-Funktionen. Dies kann nützlich sein, wenn Sie verwenden möchten, eine Ruhezustand-Funktion nicht direkt unterstützt, die von Grails/GORM.