首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate \ JBOSS数据源错误

Hibernate \ JBOSS数据源错误
EN

Stack Overflow用户
提问于 2011-04-21 06:36:40
回答 4查看 2.3K关注 0票数 1

当我尝试提交数据库时,我会得到以下异常

代码语言:javascript
复制
    java.sql.SQLException: You cannot commit with autocommit set!
        at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcComm
it(BaseWrapperManagedConnection.java:545)
        at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConne
ction.java:334)
        at net.sf.hibernate.id.TableGenerator.generate(TableGenerator.java:126)
        at net.sf.hibernate.id.TableHiLoGenerator.generate(TableHiLoGenerator.ja
va:59)

这是我的JBOSS (jboss-4.0.5.GA) MSSQLds.xml :-

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
  <jndi-name>TESTDS</jndi-name>
  <connection-url>jdbc:sqlserver://localhost:1433;DatabaseName=TESTDB</connection-url>
  <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
  <user-name>sa</user-name>
  <password>password</password>
  <check-valid-connection-sql>SELECT 1 FROM sysobjects</check-valid-connection-sql>
  <metadata>
      <type-mapping>MS SQLSERVER2000</type-mapping>
  </metadata>
  </local-tx-datasource>
</datasources> 

这里是我的提交操作(使用事务) :-

代码语言:javascript
复制
  public synchronized void commitTransaction() throws TransactionException {
    Transaction tx = (Transaction) localTransaction.get();
    Session session = (Session) localSession.get();
    try {
      tx.commit();
    }
    catch (HibernateException e) {
      log.error("Error closing the persistence when commiting.", e);
      rollbackTransaction();
      throw new TransactionException(e);
    }
    finally {
      try {
        session.close();
      }
      catch (HibernateException e) {
        log.fatal("Session could not be closed !!!", e);
      }
      localSession.set(null);
      localTransaction.set(null);
    }
    log.info("Commiting transaction with thread : " + Thread.currentThread());
  }

更新: Hibernate配置文件(hibernate.cfg.xml)

代码语言:javascript
复制
<!-- SQLSERVER configuration -->

<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>

<property name="connection.datasource">java:/TESTDS</property>

<property name="connection.pool_size">100</property>
<property name="statement_cache.size">200</property>

    <property name="transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactory</property>

<property name="show_sql">false</property>
<property name="use_outer_join">true</property>

    <!-- Hibernate mapping files configuration -->

           ..............

    <!-- Hibernate mapping files configuration -->

我试着在网上搜索,但找不到解决这个问题的办法。

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2012-03-23 09:08:24

当使用来自由DataSource容器管理的JavaEE的连接时,您无法使用JDBC控制事务。

默认情况下,当业务代码结束时,容器决定提交(或回滚),或者将其编写为Servlet、MessageDrivenBean onMessage或EJB方法。

如果要检查事务状态并最终决定将其标记为回滚(默认容器行为为提交),则必须在Servlet中从JDNI获取UserTransaction对象。

对于EJB,可以从实例所接收的带有相应的setter的上下文中获取该上下文对象。但是它需要使用TransactionManagement注释或在部署描述符中将事务模式设置为“bean管理的”。

票数 1
EN

Stack Overflow用户

发布于 2011-04-22 06:07:06

你试过设置

hibernate.connection.autocommit =假?

hibernate文档拿来的。

票数 0
EN

Stack Overflow用户

发布于 2011-04-25 12:04:36

编程事务管理代码吓到我了。

我建议你尝试使用Spring声明式事务管理

您还应该在hibernate.cfg.xml中设置:

代码语言:javascript
复制
<property name="hibernate.connection.autocommit">false</property>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5740434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档