2012-03-15 4 views
9

최대 절전 모드를 처음 사용합니다.org.hibernate.HibernateException : 활성 트랜잭션 없이는 get이 유효하지 않습니다.

  • 자동으로 생성있는 hibernate.cfg.xml (넷빈즈 마법사) 자동 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

    왜 eclipse Hibernate 도구가 자동으로 이것을 생성하지 않습니까? –

    3

    다른 해결책은 getCurrentSession() 대신 openSession()을 사용하는 것입니다. 그런 다음 쿼리를 업데이트하는 데 필요한 경우에만 트랜잭션을 사용할 수 있습니다.

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

    나는 getCurrentSession을 통해 얻은 세션이 get-operation에 대해서도 트랜잭션을 요구하지만, 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를 작성한 직후에 을 호출하여 세션을 시작해야합니다.

    관련 문제