2010-09-26 18 views
8

Tôi đang viết một ứng dụng dựa trên web với hibernate và jsp/servlet. Tôi đã đọc về các phương pháp sessionFactory.getCurrentSessionsessionFactory.openSession. Tôi biết sự khác biệt cơ bản giữa chúng (sử dụng getCurrentSession bạn không phải đóng kết nối và khi bạn cam kết giao dịch, phiên của bạn sẽ tự động đóng). Theo sự hiểu biết của tôi, chúng tôi nên chọn cho getCurrentSession và thực hiện thông qua phiên cho mỗi yêu cầu.
getCurrentSession hibernate trong web

Hãy xem xét các tình huống sau:

  1. Phương pháp A gọi getCurrentSession và có phiên hiện tại
  2. Trong Phương pháp A, một giao dịch được bắt đầu sử dụng phiên từ bước 1
  3. Phương pháp Một cuộc gọi Phương thức B, cũng có getCurrentSession và bắt đầu một giao dịch
  4. Phương thức B cam kết tran của nó saction
  5. kiểm soát trở về phương pháp A và nó cũng cam kết giao dịch

Bây giờ câu hỏi của tôi là

  1. phiên sẽ tìm thấy ở bước 1 và bước 3 sẽ là phiên giống nhau không?
  2. Nếu câu trả lời cho câu hỏi 1 là có, thì nó sẽ xử lý cam kết ở bước 4 như thế nào? Lý tưởng nhất là nên đóng phiên tại đó và phải ném một ngoại lệ ở bước 5.
  3. Nếu câu trả lời cho câu hỏi 1 là không, thì làm thế nào để bạn xử lý một kịch bản như vậy?

Trả lời

6

Tôi không có câu trả lời cho trường hợp của bạn vì tôi sẽ không thực hiện theo cách đó vì dường như nó đang gặp rắc rối. Thay vào đó, tôi sẽ bắt đầu giao dịch trong C, trong đó C gọi A và B, và có C phát hành cam kết. Skeletally:

public void c(...) { 
    try { 
     transaction.begin(); 
     a(); 
     b(); 
     transaction.commit(); 
    catch (Exception e) { 
     transaction.rollback(); 
    } 
} 

Vì vậy, ở đây, a()b() không cam kết hoặc rollback - làm thế nào để họ biết toàn bộ công việc kinh doanh đã được hoàn thành? Họ có thể ném một ngoại lệ hoặc có thể trả lại một boolean để nói với người gọi rằng một cái gì đó là không ổn định và một rollback là cần thiết.

+0

Cảm ơn Tony, tôi thích cách bạn đã đề cập đến nó. – Aashutosh

+0

@Tony Ennis: cộng một và được sắp xếp hợp lý. –

7

Phiên có thể tìm thấy ở bước 1 và bước 3 sẽ là cùng một phiên không?

Họ nên giống nhau, đó là bằng cách nào đó là một phần của hợp đồng getCurrentSession() và bạn sẽ nhận được Session ràng buộc với chủ đề miễn là đơn vị của công việc chưa được hoàn thành (ví dụ một giao dịch đã được cam kết hoặc cuộn lại). Java Persistence với Hibernate đặt nó như thế này (p.481):

Tất cả các mã truy cập dữ liệu mà các cuộc gọi getCurrentSession() trên toàn cầu chia sẻ SessionFactory được quyền truy cập vào cùng một hiện tại Session - nếu nó được gọi trong cùng một chuỗi.Đơn vị công việc hoàn thành khi Transaction được cam kết (hoặc quay lại). Hibernate cũng flushes và đóng cửa hiện tại Session và bối cảnh persistence của nó nếu bạn cam kết hoặc quay trở lại giao dịch. Ý nghĩa ở đây là một cuộc gọi đến getCurrentSession() sau khi cam kết hoặc rollback tạo ra một Session mới và bối cảnh bền vững mới.

Và bạn cũng có thể muốn đọc những gì javadoc của Session#beginTransaction() nói.

Nếu câu trả lời cho câu hỏi 1 là có, thì làm sao nó sẽ xử lý các cam kết trong bước 4. Lý tưởng nhất là nó nên đóng phiên giao dịch có bản thân và nên cung cấp cho lỗi ở bước 5.

Bước 4 không phải là vấn đề, Session sẽ bị xóa, Transaction sẽ được cam kết và Session đóng. Nhưng tôi hy vọng bước 5 để thất bại với một số TransactionException (đó là đặt cược của tôi). Nhưng hãy để tôi trích dẫn javadoc của Transaction:

Giao dịch được liên kết với Phiên và thường được khởi tạo bằng một cuộc gọi đến Session.beginTransaction(). Một phiên duy nhất có thể mở rộng nhiều giao dịch vì khái niệm của một phiên (một cuộc hội thoại giữa ứng dụng và kho dữ liệu) có độ chi tiết thô hơn khái niệm của một giao dịch. Tuy nhiên, dự định có tối đa một Giao dịch không được cam kết được liên kết với một Phiên cụ thể bất kỳ lúc nào.

Như được gạch chân ở trên, chúng tôi đang thảo luận xung quanh điều gì đó không nên xảy ra (tức là vấn đề thiết kế).

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