Sự khác nhau giữa merge với saveOrUpdate trong Hibernate:
Khi thực saveOrUpdate() 1 object:
- Nếu đối tượng đã tồn tại trong session thì nó không làm gì cả
- Nếu tồn tại 1 đối tượng khác trong cùng session mà có cùng id thì sẽ xảy ra exception
- Nếu đối tượng tượng không có id (chưa tồn tại) thì sẽ thực hiện save()
- Nếu đối tượng có id nhưng id đó chưa có trong database thì thực hiện save()
- Các trường hợp còn lại thực hiện update()
Khi thực hiện merge() 1 object:
- Nếu tồn tại 1 đối tượng khác trong session có cùng id thì nó sẽ thực hiện sao chép trạng thái của đối tượng đó (không bị exception như method saveOrUpdate())
- Nếu không có đối tượng nào có cùng id trong session thì nó sẽ cố gắng kiểm tra trong database để lấy ra hoặc tạo 1 thể hiện persistence mới
- Khi thực hiện merge() thì nó thực hiện trả về 1 đối tượng có trạng thái persistence, còn đối tượng ban đầu vẫn sẽ không bị quản lý bởi session.
Chi tiết hơn: Phân biệt save, persist, update, merge, saveOrUpdate trong hibernate
Lưu ý: các trạng thái của 1 object với session trong Hibernate:
- transient: đối tượng chưa bao giờ bị quản lí bởi session và nó không tương ứng với bản ghi nào trong database; thông thường đây là 1 đối tượng mới được tạo để save vào database
- persistent: đối tượng bị quản lý bởi session và là unique (trong 1 session không thể tồn tại 2 object có cùng id), sau khi flush bởi session sẽ tồn tại 1 bản ghi tương ứng đối tượng này trong database.
- detached: đối tượng này đã từng bị quản lý bởi session nhưng hiện tại thì không. (bị evict(), clear(), close())
- removed:cũng giống như detached nhưng bản ghi tương ứng với đối tượng này trước đó đã bị xóa khỏi database. (bị remove())
Sự khác nhau giữa merge với saveOrUpdate trong Hibernate stackjava.com
References:
http://docs.jboss.org/hibernate/orm/…Hibernate_User_Guide.html