Πώς υλοποιείται ένας μηχανισμός αισιόδοξης κλειδώματος στο Hibernate για την αποφυγή συγκρούσεων κατά την ταυτόχρονη πρόσβαση στα δεδομένα;
sobes.tech AI
Απάντηση από AI
Ο αισιόδοξος αποκλεισμός στο Hibernate υλοποιείται με τη βοήθεια της σημείωσης @Version. Αυτή η σημείωση προσθέτει ένα ειδικό πεδίο (π.χ., version) στην οντότητα, το οποίο αυξάνεται αυτόματα με κάθε ενημέρωση της εγγραφής. Κατά την αποθήκευση, το Hibernate ελέγχει αν η έκδοση στη βάση δεδομένων ταιριάζει με την έκδοση του αντικειμένου που ενημερώνεται. Αν οι εκδόσεις δεν ταιριάζουν, σημαίνει ότι τα δεδομένα έχουν τροποποιηθεί από μια άλλη συναλλαγή, και ρίχνεται μια εξαίρεση OptimisticLockException.
Παράδειγμα:
@Entity
public class Product {
@Id
private Long id;
@Version
private int version;
private String name;
private int quantity;
// getters και setters
}
Έτσι, κατά την ταυτόχρονη πρόσβαση σε μια εγγραφή, αν ένας χρήστης ενημερώσει τα δεδομένα και ένας άλλος προσπαθήσει να αποθηκεύσει μια παλιά έκδοση, το Hibernate θα ανιχνεύσει τη σύγκρουση και θα αποτρέψει την υπεγράφη των δεδομένων χωρίς να λάβει υπόψη τις αλλαγές του άλλου χρήστη.