2010-07-10 26 views

Trả lời

11

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().

+0

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ì? –

+1

@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

103

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, ...).

+4

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

+0

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

50

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.

+5

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

+1

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

18

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

8

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ệ.

0

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.

1

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)

Các vấn đề liên quan