2017-05-09 17 views
2

Hibernate 4.3から5.2への移行後に、エラーが発生しました。javax.persistence.TransactionRequiredException:トランザクションが進行中ではありません。このエラーの原因は何ですか?なぜトランザクションが存在しないのですか?Hibernate 5.2.10.Final - javax.persistence.TransactionRequiredException:トランザクションが進行中ではありません

public class HibernateUtil { 
private static StandardServiceRegistry registry; 
private static SessionFactory sessionFactory; 
private static final Logger logger = LogManager.getLogger(HibernateUtil.class); 
private static final ThreadLocal<Interceptor> threadInterceptor = new ThreadLocal<>(); 
private static final ThreadLocal<Session> threadSession = new ThreadLocal<>(); 

/** 
* Retrieves the current Session local to the thread. 
* 
* <p/> 
* If no Session is open, opens a new Session for the running thread. 
* 
* @return Session 
*/ 
public static Session getSession() throws InfrastructureException { 
    Session s = threadSession.get(); 
    try { 
     if (s == null) { 
      if (getInterceptor() != null) { 
       if (logger.isDebugEnabled()) { 
        logger.debug("Using interceptor: " + getInterceptor().getClass()); 
       } 
       s = getSessionFactory().openSession(); 
      } else { 
       s = getSessionFactory().openSession(); 
      } 
      threadSession.set(s); 
     } 
    } catch (HibernateException ex) { 
     throw new InfrastructureException(ex); 
    } 
    return s; 
} 

public static SessionFactory getSessionFactory() { 
    if (sessionFactory == null) { 
     try { 
      // Create registry 
      registry = new StandardServiceRegistryBuilder() 
        .configure() 
        .build(); 

      // Create MetadataSources 
      MetadataSources sources = new MetadataSources(registry); 

      // Create Metadata 
      Metadata metadata = sources.getMetadataBuilder().build(); 

      // Create SessionFactory 
      sessionFactory = metadata.getSessionFactoryBuilder().build(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      if (registry != null) { 
       StandardServiceRegistryBuilder.destroy(registry); 
      } 
     } 
    } 
    return sessionFactory; 
} 

private static Interceptor getInterceptor() { 
    return threadInterceptor.get(); 
} 

データベース(BaseDAO)にオブジェクトを格納する一般的な方法です。 session.flush()行にエラーがスローされます。 UserDAOクラスの

protected static void storeObject(Object object) throws DAOException { 
    try { 
     Session session = Helper.getHibernateSession(); 
     session.saveOrUpdate(object); 
     session.flush(); 
     session.beginTransaction().commit(); 
    } catch (HibernateException he) { 
     rollback(); 
     throw new DAOException(he); 
    } 
} 

方法:

public void save(User user) throws DAOException { 
    storeObject(user); 
} 

hibernate.cf.xml

<session-factory> 
    <!-- SQL - Settings --> 
    <property name="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/test?autoReconnect=true&amp;autoReconnectForPools=true 
    </property> 
    <property name="hibernate.connection.username">test</property> 
    <property name="hibernate.connection.password">test</property> 

    <!-- connection pool --> 
    <property name="hibernate.c3p0.max_size">5000</property> 
    <property name="hibernate.c3p0.min_size">10</property> 
    <property name="hibernate.c3p0.timeout">180</property> 
    <property name="hibernate.c3p0.max_statements">0</property> 
    <property name="hibernate.c3p0.idle_test_period">10</property> 
    <property name="hibernate.c3p0.acquire_increment">1</property> 
    <property name="hibernate.c3p0.validate">true</property> 

    <!-- use the C3P0 connection pool --> 
    <property name="connection.provider_class"> 
     org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider 
    </property> 

    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">managed</property> 

    <!-- Don't echo all executed SQL to stdout --> 
    <property name="show_sql">false</property> 
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 

    <!-- Validate database schema on startup --> 
    <property name="hbm2ddl.auto">validate</property> 

    <!-- Mapping --> 
    <mapping class="org.test.data.database.beans.User"/> 

</session-factory> 

答えて

1

session.beginTransaction().commit(); 

開始し、すぐにコミット(終了)トランザクション。しかし、あなたのflush()はその間に起こる必要があります。私は同じエラーを持っていますが、すべての操作のようなものです

protected static void storeObject(Object object) throws DAOException { 
    Transaction tx = null; 
    try { 
    Session session = Helper.getHibernateSession(); 
    session.saveOrUpdate(object); 
    tx = session.beginTransaction(); 
    session.flush(); 
    tx.commit(); 
    } catch (HibernateException he) { 
    if(tx != null){ 
     tx.rollback(); 
    } 
    throw new DAOException(he); 
    } 
} 
+0

:代わりにこれを試してみてください。セッションセッション= HibernateUtil.getSessionFactory()のOpenSession(); try { session.beginTransaction(); session.saveOrUpdate(entityObj); session.getTransaction()。commit(); } catch(RuntimeException e){ session.getTransaction()。rollback(); e.printStackTrace(); }最後に{ session.flush(); session.close(); } – Filippo1980

+0

トランザクションの暗黙的な使用と直接的な違いがありますか? – Filippo1980

関連する問題