2012-03-15 28 views
9

Tôi mới sử dụng Hibernate.org.hibernate.HibernateException: nhận được không hợp lệ mà không có giao dịch hoạt động

  • Tự động tạo hibernate.cfg.xml (Netbeans wizard)
  • Tự động tạo HibernateUtil.java
  • Tự động tạo ra lớp POJO với các chú thích

Đang cố gắng để có được đối tượng từ cơ sở dữ liệu nhưng nhận được lỗi:

Exception in thread "pool-1-thread-1" org.hibernate.HibernateException: get is not valid without active transaction 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) 

nhận đối tượng:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid); 

hibernate.cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sochi_feedback</property> 
<property name="hibernate.connection.username">root</property> 
<property name="hibernate.connection.password">root</property> 
<property name="hibernate.show_sql">true</property> 
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 
<property name="hibernate.current_session_context_class">thread</property> 
+0

Bạn có thể thêm mã gọi phương thức get() không? –

+0

@ShashankKadne 'CallInfo ci = (CallInfo) session.get (CallInfo.class, ucid);' – VextoR

+1

Thêm "Transaction tx = session.beginTransaction();" ngay trước dòng này và vào cuối hoạt động của bạn, hãy gọi "tx.commit();" –

Trả lời

14

Thêm

Transaction tx = session.beginTransaction(); // Tuyên bố này sẽ bắt đầu giao dịch

ngay trước khi bạn CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid);

và ở phần cuối của bạn giao dịch cam kết thay đổi bằng cách gọi ..

tx.commit(); 
+3

lý do tại sao công cụ hibernate eclipse không tự động tạo ra điều này? –

3

Một giải pháp khác là sử dụng openSession() thay vì getCurrentSession(). Sau đó, giao dịch chỉ có thể được sử dụng khi được yêu cầu để cập nhật truy vấn.

Session session = HibernateUtil.getSessionFactory().openSession(); 
CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid); 
+0

Tôi đang trải qua chính xác điều này, tức là các phiên thu được thông qua getCurrentSession yêu cầu một giao dịch ngay cả đối với các hoạt động có được, trong khi điều này không áp dụng khi sử dụng openSession. Tại sao vậy? (Tôi đã nghĩ rằng các đối tượng phiên là giống nhau?) –

+0

Tôi đã có cùng một vấn đề. Nhưng tại sao? –

0

Ngay cả sau khi beginTransaction() và và commit() nếu bạn vẫn nhận được

Caused by: org.hibernate.HibernateException: setDefaultReadOnly is not valid without active transaction 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) 

vào "Start" và tìm kiếm các dịch vụ và khởi động lại dịch vụ cơ sở dữ liệu

0

Trước khi bạn thực sự bắt đầu giao dịch bạn cần phải bắt đầu phiên bằng cách gọi , ngay sau khi bạn tạo sessionFactory.

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