Khi chúng tôi đang cập nhật bản ghi, chúng tôi có thể sử dụng session.flush()
với Hibernate. Nhu cầu cho flush()
là gì?Việc sử dụng session.flush() trong Hibernate
Trả lời
Xối rửa phiên sẽ nhận dữ liệu hiện đang trong phiên được đồng bộ hóa với những gì có trong cơ sở dữ liệu.
Thông tin thêm về website Hibernate:
flush()
là hữu ích, bởi vì có hoàn toàn không đảm bảo về khi phiên thực hiện các JDBC gọi, chỉ có thứ tự mà chúng được thực hiện - ngoại trừ bạn sử dụng flush()
.
Làm chậm các lực lượng phiên Hibernate để đồng bộ hóa trạng thái trong bộ nhớ của Session
với cơ sở dữ liệu (tức là ghi các thay đổi vào cơ sở dữ liệu). Theo mặc định, Hibernate sẽ tuôn thay đổi tự động cho bạn:
- trước một số hành truy vấn
- khi một giao dịch cam kết
phép để tuôn ra một cách rõ ràng Session
cho kiểm soát tốt có thể cần thiết trong một số hoàn cảnh (để nhận được ID được chỉ định, để kiểm soát kích thước của Phiên, ...).
Lưu ý rằng câu trả lời này mô tả hành vi DEFAULT Hibernate: hành vi tuôn ra có thể được thay đổi thông qua cài đặt Chế độ xả. Chi tiết có trong http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html (phiên bản 3.5). – SteveT
Tôi tìm thấy [tài liệu] (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-flushing) nơi nó nói chính xác những gì bạn đang nói nhưng tôi có câu hỏi rằng ưu tiên có nghĩa là giả sử 1) Tôi có lớp mà tôi đang lưu đối tượng bằng cách sử dụng mã 'id = session.save (obj);' và giao dịch được cam kết ở dòng tiếp theo nhưng obj không được lưu vào DB, Tại sao?2) Tôi đã lưu obj bằng cách sử dụng 'session.save (obj);' với commit và trong khi trả về tôi đã sử dụng 'return obj.getprimaryID();' Trong trường hợp này obj được lưu vào DB. Vậy tại sao hành vi này lại xảy ra? – Amogh
Như đã nói đúng trong câu trả lời ở trên, bằng cách gọi flush()
, chúng tôi buộc ngủ đông để thực thi các lệnh SQL trên Cơ sở dữ liệu. Nhưng hãy hiểu rằng những thay đổi chưa được "cam kết". Vì vậy, sau khi thực hiện tuôn ra và trước khi thực hiện cam kết, nếu bạn truy cập trực tiếp vào DB (nói từ lời nhắc SQL) và kiểm tra các hàng đã sửa đổi, bạn sẽ KHÔNG thấy các thay đổi.
Điều này giống như mở 2 phiên lệnh SQL. Và các thay đổi được thực hiện trong 1 phiên không hiển thị với những người khác cho đến khi được cam kết.
Vâng - những thay đổi có thể được nhìn thấy một chút. Ví dụ, một hàng không được cam kết có thể tạo một khóa trên hàng được chèn vào nhưng không được cam kết và trì hoãn cùng một hàng được chèn bởi một phiên khác cho đến khi giao dịch được thực hiện hoặc quay trở lại. Vì vậy, nó không phải là hoàn toàn vô hình. – rghome
Tôi đã lướt trên tất cả các trang web và đây là câu trả lời cuối cùng đã làm cho tôi nhận được nó. Cảm ơn. – Siddhartha
Tôi chỉ biết rằng khi chúng tôi gọi session.flush()
các báo cáo của chúng tôi được thực hiện trong cơ sở dữ liệu nhưng không được cam kết.
Giả sử chúng ta không gọi phương thức flush()
trên đối tượng phiên và nếu chúng ta gọi phương thức cam kết .... nó sẽ thực hiện công việc thực hiện các câu lệnh trên cơ sở dữ liệu và sau đó cam kết.
commit=flush+commit
(trong trường hợp chức năng)
Vì vậy, tôi kết luận rằng khi chúng ta gọi phương thức flush() trên phiên đối tượng sau đó nó không được cam kết nhưng lượt truy cập cơ sở dữ liệu và thực hiện truy vấn và bị rollback quá
để cam kết chúng tôi sử dụng cam kết() trên đối tượng giao dịch
Bạn có thể sử dụng flush
để buộc chế xác nhận để được thực hiện và phát hiện ở một nơi được biết đến hơn khi giao dịch được thực hiện. Có thể là commit
được gọi ngầm bởi một số logic khung, thông qua logic khai báo, vùng chứa hoặc bởi một mẫu. Trong trường hợp này, bất kỳ trường hợp ngoại lệ nào cũng có thể khó nắm bắt và xử lý (nó có thể quá cao trong mã).
Ví dụ: nếu bạn save()
đối tượng EmailAddress mới, có ràng buộc duy nhất trên địa chỉ, bạn sẽ không gặp lỗi cho đến khi bạn cam kết.
Gọi flush()
buộc hàng được chèn vào, ném Ngoại lệ nếu có bản sao.
Tuy nhiên, bạn sẽ phải quay lại phiên sau khi ngoại lệ.
Gọi EntityManager#flush
không có phản ứng phụ. Nó được sử dụng thuận tiện cho các loại thực thể với các giá trị ID được tạo (giá trị chuỗi): một ID như vậy chỉ có sẵn khi đồng bộ hóa với lớp kiên trì cơ bản. Nếu ID này là bắt buộc trước khi giao dịch hiện tại kết thúc (ví dụ như cho mục đích ghi nhật ký), cần phải xóa phiên.
tôi sẽ giống như câu lạc bộ tất cả các câu trả lời đưa ra ở trên và cũng có thể liên hệ phương pháp Flush() với Session.save() để cung cấp thêm tầm quan trọng
Hibernate tiết kiệm() có thể được sử dụng để tiết kiệm thực thể cơ sở dữ liệu . Chúng ta có thể gọi phương thức này bên ngoài một giao dịch, đó là lý do tại sao tôi không thích phương pháp này để lưu dữ liệu. Nếu chúng ta sử dụng điều này mà không có giao dịch và chúng ta có tầng giữa các thực thể, thì chỉ thực thể chính mới được lưu trừ khi chúng ta xóa phiên.
flush(): Buộc phiên bị xóa. Nó được sử dụng để đồng bộ hóa dữ liệu phiên với cơ sở dữ liệu.
Khi bạn gọi session.flush(), các câu lệnh được thực hiện trong cơ sở dữ liệu nhưng nó sẽ không được cam kết. Nếu bạn không gọi session.flush() và nếu bạn gọi session.commit(), phương thức commit nội bộ() thực thi câu lệnh và commit.
Vì vậy, cam kết() = tuôn ra + cam kết. Vì vậy session.flush() chỉ thực hiện các câu lệnh trong cơ sở dữ liệu (nhưng không phải là các commit) và các câu lệnh KHÔNG còn trong bộ nhớ nữa. Nó chỉ buộc phiên họp tuôn ra.
vài điểm quan trọng:
Chúng ta nên tránh tiết kiệm ranh giới giao dịch bên ngoài, các tổ chức khác ánh xạ sẽ không được lưu gây mâu thuẫn dữ liệu. Sẽ rất bình thường khi quên xóa phiên vì nó không ném bất kỳ ngoại lệ hoặc cảnh báo nào. Theo mặc định, Hibernate sẽ tự động thay đổi tự động cho bạn: trước khi thực hiện truy vấn khi giao dịch được thực hiện Cho phép xóa rõ ràng Phiên cung cấp điều khiển tốt hơn có thể được yêu cầu trong một số trường hợp (để có ID được chỉ định, để kiểm soát kích thước của phiên)
- 1. Việc sử dụng thẻ túi trong Hibernate là gì?
- 2. Ưu điểm của việc sử dụng Gọi lại Hibernate?
- 3. việc sử dụng các chú thích Hibernate @LazyCollection
- 4. Có một giao dịch Hibernate rollback xóa "session.flush()" ed thực thể?
- 5. Hướng dẫn sử dụng Hibernate trong Android?
- 6. Lợi ích của việc sử dụng Quản lý giao dịch Springs và sử dụng hibernate
- 7. Việc sử dụng c3p0.idle_test_period.
- 8. Bắt DbUnit để làm việc với giao dịch Hibernate
- 9. Quản lý phiên sử dụng Hibernate trong ứng dụng Swing
- 10. CÁCH SỬ DỤNG CÓ COUNT (*) với hibernate
- 11. Text Field sử dụng Hibernate Chú
- 12. Tại sao nên sử dụng Hibernate/nHibernate?
- 13. Hibernate tải lười biếng không làm việc
- 14. Sử dụng Hibernate để làm việc với Tập tin Văn bản
- 15. Sử dụng lại các truy vấn trong Hibernate
- 16. Hibernate: cách sử dụng CONCAT và GROUP_CONCAT
- 17. Cách sử dụng hibernate bằng() và hashCode()?
- 18. Hibernate sử dụng JDBC như thế nào?
- 19. Khi nào sử dụng chú thích DiscriminatorValue trong hibernate
- 20. Hibernate bên trong tham gia bằng cách sử dụng hql
- 21. Sự khác nhau giữa session.commit() và session.flush() là gì?
- 22. Sử dụng PersistenceContext trong Công việc Thạch anh
- 23. Hibernate Mapping không làm việc trong chế độ offline
- 24. Việc sử dụng @SuppressWarnings
- 25. Việc sử dụng/lợi thế của việc sử dụng CommandBehavior.CloseConnection trong ExecuteReader()
- 26. Việc sử dụng CoTaskMemAlloc?
- 27. Việc sử dụng extern trong C++
- 28. Việc sử dụng moveToFirst() trong SQLite Cursors
- 29. Việc sử dụng BaseColumns trong Android
- 30. việc sử dụng MemoryFile trong android
Bạn có thể cung cấp tình huống khi người dùng phải lo lắng về chuỗi không? Sử dụng hibernate là làm cho những thứ liên quan đến DB trong suốt với người dùng. Khi chúng ta làm "cam kết", xả nước diễn ra tự động. Kịch bản mà bạn sẽ tuôn ra nhưng không cam kết là gì? –
@KaushikLele bạn có thể tham khảo câu hỏi này http://stackoverflow.com/questions/37382872/spring-transactional-annotation-isolation-not-working-for-read-uncommitted – GMsoF