Hibernate có thể ném ra một ConstraintViolationException
khi bạn cố gắng chèn một hàng phá vỡ một ràng buộc (bao gồm một ràng buộc duy nhất). Nếu bạn không nhận được ngoại lệ đó, bạn có thể nhận được một số ngoại lệ Hibernate chung khác - nó phụ thuộc vào phiên bản Hibernate và khả năng của Hibernate ánh xạ ngoại lệ MySQL thành ngoại lệ Hibernate trong phiên bản và loại cơ sở dữ liệu bạn đang sử dụng ( Tôi chưa thử nghiệm nó trên mọi thứ).
Bạn sẽ chỉ nhận được ngoại lệ sau khi gọi flush()
, vì vậy bạn nên đảm bảo rằng điều này cũng nằm trong khối try-catch của bạn.
Tôi sẽ cẩn thận khi triển khai các giải pháp trong đó bạn kiểm tra xem hàng có tồn tại trước không. Nếu nhiều phiên cập nhật bảng đồng thời, bạn có thể nhận được điều kiện cuộc đua. Hai tiến trình đọc hàng gần như cùng một lúc để xem nó có tồn tại hay không; cả hai đều phát hiện ra rằng nó không có ở đó, và sau đó cả hai đều cố gắng tạo một hàng mới. Một người sẽ thất bại tùy thuộc vào người thắng cuộc đua.
Một giải pháp tốt hơn là thử chèn trước và nếu nó không thành công, hãy giả sử rằng nó đã ở đó rồi. Tuy nhiên, một khi bạn có một ngoại lệ, bạn sẽ phải quay lại, vì vậy điều đó sẽ hạn chế cách bạn có thể sử dụng phương pháp này.