【问题标题】:Hibernate, Wildfly, JNDI Config: Cannot commit during a managed transactionHibernate、Wildfly、JNDI 配置:在托管事务期间无法提交
【发布时间】:2015-06-28 19:16:13
【问题描述】:

我目前在 Java-Web-Application 中使用 HibernateWildfly 时遇到问题:

例外:

Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:116) [hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:180) [hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    ... 194 more
Caused by: java.sql.SQLException: You cannot commit during a managed transaction!
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:1065)
    at org.jboss.jca.adapters.jdbc.WrappedConnection.commit(WrappedConnection.java:758)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112) [hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    ... 195 more

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.datasource">java:/jdbc/salome-database</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.archive.autodetection">class</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <mapping resource="hibernate-mapping.xml"/>

    </session-factory>
</hibernate-configuration>

HibernateUtil.java

public static SessionFactory getSessionFactory()
{
    if (sessionFactory == null)
    {
        // loads configuration and mappings
        Configuration configuration = new Configuration().configure();
        ServiceRegistry serviceRegistry
                = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();

        // builds a session factory from the service registry
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    }

    return sessionFactory;
}

EventDAO.java

public Event getById(int id)
{
    List<Event> eventList = new ArrayList<Event>();

    Session session = sessionFactory.getCurrentSession();
    session.getTransaction().begin();

    try
    {
        Query q = session.createQuery("from Event as event where event.id='" + id + "'");
        q.setCacheable(true);
        eventList = (List<Event>) q.list();
        session.getTransaction().commit();
    }

    catch (RuntimeException e)
    {
        throw e;
    }

    finally
    {
    }

    if (eventList.isEmpty())
    {
        return null;
    }
    else
    {
        return eventList.get(0);
    }
}

public void addEvent(Event event)
{
    Session session = sessionFactory.getCurrentSession();
    session.getTransaction().begin();

    try
    {
        session.save(event);
        session.getTransaction().commit();
    }

    catch (RuntimeException e)
    {
        throw e;
    }

    finally
    {
    }
}

public void deleteEvent(Event event)
{
    Session session = sessionFactory.getCurrentSession();
    session.getTransaction().begin();

    try
    {
        session.delete(event);
        session.getTransaction().commit();
    }

    catch (RuntimeException e)
    {
        throw e;
    }

    finally
    {
    }
}

我已经做了很多搜索并找到了一个线程,解决方案是删除所有 Transaction 处理,因为 JTA 会处理这个问题。当我删除 transaction.commit() 语句时,我收到另一个异常通知我不支持嵌套事务。

编辑: 我在 wildfly 控制台中使用以下语句创建了 JNDI / 数据源:

data-source add --name=salome-datasource --jndi-name=java:/jdbc/salome-database --driver-name=mysql-connector-java-5.1.35.jar_com.mysql.jdbc.Driver_5_1 --connection-url=jdbc:mysql://127.0.0.1:3306/salomeapp --user-name=*** --password=***

【问题讨论】:

    标签: java hibernate transactions wildfly


    【解决方案1】:

    您还应该删除 session.getTransaction().begin(); 以及 session.getTransaction().commit();

    当您使用容器管理事务时,您永远不应该自己启动事务。当您不知道自己在做什么时,容器管理的事务是您的最佳选择。

    您应该阅读一些关于 java ee 中的 container managed transactions 的内容。

    【讨论】:

    • 我应该在开头使用Session session = sessionFactory.openSession();,在查询工作完成后使用session.close();
    • 我不是休眠用户,所以我无法帮助您。虽然我会建议你选择 JPA,但它会让你的生活变得更轻松。它仍然可以使用 hibernate 作为实现,但 JPA 更好地集成在 Java EE 中。
    猜你喜欢
    • 2015-09-26
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多