2012-03-15 5 views
9

Я новичок в Hibernate.org.hibernate.HibernateException: get недействителен без активных транзакций

  • Автоматически создается hibernate.cfg.xml (мастер Netbeans)
  • Автоматически создается HibernateUtil.java
  • Автоматически создается POJO класс с аннотациями

пытается получить объект из базы данных, но получаю ошибку:

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) 

получение объекта:

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

Можете ли вы добавить код, который вызывает метод get()? –

+0

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

+1

Добавить "Транзакция tx = session.beginTransaction();" перед этой строкой и в конце вашей операции вызывается «tx.commit()»; –

ответ

14

Добавить

Transaction tx = session.beginTransaction(); // Это утверждение будет инициировать транзакцию

непосредственно перед CallInfo ci = (CallInfo) session.get(CallInfo.class, ucid);

и в конце вашего транзакция фиксирует изменения по телефону.

tx.commit(); 
+3

Почему инструмент hibernate eclipse автоматически не генерирует это? –

3

Другим решением является использование openSession() вместо getCurrentSession(). Затем транзакции могут использоваться только тогда, когда это необходимо для обновления запросов.

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

Я испытываю именно это, т. Е. Что сеансы, полученные через getCurrentSession, требуют транзакции даже для get-операций, тогда как это не применяется при использовании openSession. Почему это? (Я думал, что объекты сеанса идентичны?) –

+0

У меня была такая же проблема. Но почему? –

0

Даже после того, как beginTransaction() и и commit(), если вы все еще получаете

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

перейти в «Пуск» и поиск услуг и перезапустить службу базы данных

0

Перед тем, как на самом деле начать транзакцию вы необходимо запустить сеанс, вызвав , сразу после создания sessionFactory.

Смежные вопросы