2013-07-17 28 views
5

Yêu cầu của tôi là tôi muốn thực hiện một thao tác cơ sở dữ liệu. Vì vậy, tôi đang làm ...Làm thế nào để kiểm tra xem phiên đã mở giao dịch hay không ở chế độ ngủ đông?

Public boolean myFunction(){ 
    Session session = sessionFactory.getCurrentSession(); 
    if(session!=null){ 
     if (tx != null) { 
      Transaction tx = session.beginTransaction(); 
      //Perform database operation... 
      tx.rollback(); 
      if (session.isOpen()) { 
      session.close(); 
      } 
      tx = null; 
      session = null; 
     } 
    }else{ 
     return; 
    } 
} 

này hoạt động tốt khi phiên của tôi không chứa bất kỳ trước uncommited/tranasction unrolledback.

Bây giờ, vấn đề là ở đây Sceanario ...

Sceanario:

có một dịch vụ ... mà gọi là myFunction() và dịch vụ mà có đã một giao dịch tích cực trong phiên.

Sự cố: Khi hàm chức năng() thực hiện tx.rollback() ... nó cũng đã cuộn lại giao dịch của cha mẹ.

1.) Why this happen??? 
2.) Is there nay way to determine... weather hibernate session contains any previous open/uncommited/active/unrolledback/continue transaction? 

Tôi đã cố gắng ...

Public boolean myFunction(){ 
    Session session = sessionFactory.getCurrentSession(); 
    if(session!=null){ 
     if (tx != null) { 
      boolean isAlreadyTransactionStarted = sessionFactory.getCurrentSession().getTransaction().isActive(); 
      if(isAlreadyTransactionStarted){ 
       Transaction tx = sessionFactory.getCurrentSession().getTransaction(); 
      }else{ 
       Transaction tx = session.beginTransaction(); 
      } 
      //Perform database operation... 
      if(isAlreadyTransactionStarted){ 
       tx.rollback(); 
       if (session.isOpen()) { 
       session.close(); 
       } 
       tx = null; 
       session = null; 
      }else{ 
       //Nothing to do... 
      } 
     } 
    }else{ 
     return; 
    } 
} 

nhưng trong trường hợp

1.) When parent call contains any active transactions then isAlreadyTransactionStarted becomes true. 

2.) But in the case call which does not contains any transaction, also isAlreadyTransactionStarted becomes true. 

Câu hỏi của tôi là vẫn giống nhau:

Có cách nay để xác định .. thời tiết hibernate phiên chứa bất kỳ trước đó mở/uncommited/hoạt động/unrolledback/tiếp tục giao dịch?

Trả lời

1

Bạn có thể sử dụng Session.isDirty() không?

+0

nó mang lại cho tôi một ngoại lệ: org.hibernate.HibernateException: isDirty không hợp lệ mà không có giao dịch hoạt động –

+0

Vâng ... có bạn đi :) Bây giờ bạn biết không có giao dịch .... Nhưng nghiêm túc, có lẽ bạn có thể gọi nó sau khi bạn gọi sessionFactory.getCurrentSession(). getTransaction(). Vì vậy, bạn sẽ luôn có một giao dịch hoạt động, nhưng phiên có thể không phải lúc nào cũng bị bẩn. – Nicholas

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