2010-07-14 27 views
5

Tại sao tôi cần dòng "session.save (người dùng);" trong đoạn mã sau? Tôi nghĩ, với cuộc gọi tìm người dùng đã được đính kèm vào phiên và các thay đổi sẽ được theo dõi và cam kết. Bạn có muốn giải thích chi tiết cho tôi không? Hay tôi cần một cấu hình đặc biệt hoặc các trường hợp khác mà tôi có thể nghe nói về 'tính năng' này?Tại sao tôi cần phải tiết kiệm một cách rõ ràng sau khi tìm thấy với Hibernate?

session = createSession(); 
ta = session.beginTransaction(); 
assertEquals(1, session.createCriteria(MyUser.class).list().size()); 
// find one user 
MyUser user = session.createCriteria(MyUser.class).uniqueResult(); 
user.setName("Rocker!"); 
// ### HERE ### 
// WHY this 'save' is necessary!!?? 
session.save(user); 
ta.commit(); 

ta = session.beginTransaction(); 
assertEquals(1, session.createCriteria(MyUser.class).list().size()); 
MyUser user = session.createCriteria(MyUser.class).uniqueResult(); 
assertEquals("Rocker!", user.getName()); 
ta.commit(); 

CẬP NHẬT 1

Cùng một câu hỏi áp dụng cho

  1. session.save (người sử dụng);
  2. user.setName ("Rocker!");
  3. ta.commit();

UPDATE 2

Giải pháp cho vấn đề là: Tôi đang sử dụng Guice/warp tồn tại. Và trong một số trường hợp, tôi đã chặn không chính xác khối mã vào giao dịch qua @Transactional: do đó giao dịch được thực hiện quá sớm và do đó thay đổi riêng biệt không được bao gồm trong cam kết. Cảm ơn các bạn! Vì vậy, luôn luôn chắc chắn rằng bạn biết về phạm vi giao dịch của bạn trong trường hợp bạn đang sử dụng lò xo hoặc Guice ...

+0

bạn đã bật đăng nhập ngủ đông để kiểm tra xem điều gì sẽ xảy ra giữa sự trở lại từ uniqueresult() và commit()? –

+0

Tôi luôn làm điều đó với 'tiết kiệm' rõ ràng những tháng cuối cùng với chế độ ngủ đông. cho đến ngày hôm nay: nơi tôi tự hỏi điều này. Tôi sẽ xem xét các bản ghi. Nhưng hãy nhìn vào bản chỉnh sửa của tôi bên dưới mã: việc lưu rõ ràng cũng cần thiết sau khi tôi đã gọi tiết kiệm – rocker

+0

cũng bất cứ khi nào một cái gì đó hoạt động trong một thời gian dài "cho đến ngày hôm nay" và mã không thay đổi, nó ngụ ý một số cấu hình ở nơi khác đã thay đổi - hãy chắc chắn xem lại chính xác những gì đã thay đổi trong toàn bộ dự án/ứng dụng kể từ trạng thái làm việc đã biết cuối cùng. Rõ ràng mọi thứ không chỉ ngừng hoạt động. –

Trả lời

5

Bạn là chính xác mà ngủ đông sẽ tự động phát hiện thay đổi đối với nhà nước của các đối tượng liên tục:

dai dẳng - một thể hiện dai dẳng có một biểu diễn trong cơ sở dữ liệu và một giá trị định danh. Nó có thể chỉ được lưu hoặc tải, tuy nhiên, nó theo định nghĩa trong phạm vi của một phiên. Hibernate sẽ phát hiện bất kỳ thay đổi nào được thực hiện cho một đối tượng trong trạng thái liên tục và đồng bộ hóa trạng thái với cơ sở dữ liệu khi đơn vị công việc hoàn thành. Các nhà phát triển không thực hiện các câu lệnh UPDATE thủ công hoặc các câu lệnh DELETE khi một đối tượng cần được thực hiện tạm thời.

Tôi cho rằng kết quả tiêu chí không được trả lại trong tình trạng dai dẳng (nhưng tôi dường như không thể tìm thấy bằng chứng về điều này trong các tài liệu)

Hãy thử sử dụng một truy vấn HQL, mà các tài liệu là rõ ràng:

trường Entity lấy ra bằng một truy vấn đang ở trong một tình trạng dai dẳng

Ngoài ra hãy chắc chắn rằng chế độ tuôn ra phiên được thiết lập để AUTO o r COMMIT.

+0

Chế độ xả 'AUTO' - là chế độ mặc định và cách tôi có thể thay đổi? – rocker

+0

Với truy vấn HQL nó là giống nhau: một lưu rõ ràng (sau khi một cái gì đó thay đổi) là cần thiết. – rocker

+1

@rocker, 'session.setFlushMode (FlushMode.AUTO)'. –

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