Hibernate Objekte locken

Hallo zusammen,

weiß jemand wie man mit hibernate objekte richtig lockt???
Weil ich möchte dass wenn ein client z.B. ein kunde mit der ID eins schon offen hat, nur dieser client den kunden ändern kann und die anderen clients ihn nur anschauen können…also setz ich in meiner session.load den lock level… aber woher/wie bekomm ich von diesem objekt den lock level mit… oder hagelt es eine exception wenn ich auf das objekt eine 2te schreib sperre setzen will??? Weiß jemand wie man dass am besten umsetzt???

thx und schönes WE noch :slight_smile:

Du kannst auf Datenbankebene locken, das ist aber von deiner Datenbank abhängig. Das kannst du entweder manuell machen oder per Hibernate, da hab ich das gelesen aber noch nicht gemacht.
Alternativ kannst du dir einen eigenen Mechanismus bauen, was ich dir eher empfehlen würde, da locken von Tabellen oder ähnlichem eigentlich eine sehr schlechte Lösung ist.
Alternative:
Du könntest hinter jeden Datensatz ein Feld machen für die ID wer gelockt hat oder eine weitere Tabelle in der du denjenigen aufführst. Hier würde ich dir auch raten einen Timestamp einzubauen damit die Locks irgendwann verfallen. Weil bricht die Verbindung zusammen und der Lock wird nicht freigegeben kommt niemand an die Daten ran :wink:

ja mit der session.lock methode kannst du objekte ja locken… müsst dann ja schon gehen…
aber meine frage ist wenn ich sowas mache



public void getBuch(Long id)
{
session = getCurrentSession();
session.beginTransaction();

Buch b = (Buch)session.load(Buch.class, id, LockMode.WRITE);

return b;
}

wann ist die transaction vorbei???nachdem return oder erst wenn ich ein ein commit oder rollback aufrufe???

Kommt darauf an wo deine Session noch gespeichert ist, gibt es keine Referenz mehr auf deine Session wird sie vernichtet und somit auch beendet, aber sonst sollte sie weiter laufen.

das heißt ich müsste die transaction eigentlich mit übergeben und in meiner GUI klasse erzeugen damit ich dort regeln kann dass kein dirty read vorkommt…

Ja also es ist so wie Eagle es gesagt hat. Vllt hilft auch einfach ne Manager Klasse?

würde aber gern das locking von der datenbank benutzen… muss doch irgendwie gehen…

Ich mach das eigentlich immer so das ich eine Klasse hab die alle Datenbankaktionen enthält, diese Klasse ist bei mir dann auch immer als Singleton realisiert. So muss ich sie nicht durchreichen sondern jeder kann einfach auf sie zugreifen.

ja kling auch vernünftig doch ich hab keinen server also hab ich auch nicht alle transaktionen und DB- Server haben von sich aus schon ein locking verfahren… und wolllte ich nutzen