【问题标题】:Disable Transactions for Hibernate calling Stored Procedures禁用 Hibernate 调用存储过程的事务
【发布时间】:2012-11-03 15:27:38
【问题描述】:

对于我们的 Web 应用程序,所有数据库访问都是通过存储过程执行的。这个设计决定是一成不变的,我无法改变它。

此外,所有事务处理都在存储过程中完成。 Java 层不得使用事务。

我可以使用普通的 JDBC 轻松完成此任务。但我更喜欢使用 Hibernate 的 ORM 和缓存功能。

用 Hibernate 调用存储过程很简单:

final Session session = sessionFactory.getCurrentSession();
final Query query = session.createSQLQuery("EXEC dbo.SP_ProductSearch :searchStr").addEntity(Product.class).setString("searchStr", "ap");
return query.list();

但是当我运行数据库配置文件时,我看到以下内容。

SET IMPLICIT_TRANSACTIONS ON
EXEC dbo.SP_ProductSearch  N'ap'
IF @@TRANCOUNT > 0 COMMIT TRAN
IF @@TRANCOUNT > 0 COMMIT TRAN
SET IMPLICIT_TRANSACTIONS OFF

我是否可以禁用 4x 事务语句?

我的技术栈如下。

  • 春季 3.1.2
  • 休眠 4.1.8
  • jTDS(JDBC 驱动程序)1.2.5
  • MS SQL Server 10.x

非常感谢...亚当。


@ctapobep - 这就是使用普通 JDBC 的方式。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class PlainJdbcTest
{
    private static final String USERNAME = "sa";
    private static final String PASSWORD = "password";
    private static final String URL = "jdbc:jtds:sqlserver://myserver:1433;DatabaseName=testDatabase;prepareSQL=0";
    private static final String QUERY = " EXEC dbo.SP_ProductSearch ?";
    private static final String DRIVER = "net.sourceforge.jtds.jdbc.Driver";


    public static void main(String[] args) throws Exception
    {
        Class.forName(DRIVER).newInstance();

        final Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        final PreparedStatement statement = connection.prepareStatement(QUERY);
        statement.setString(1, "ba");
        final ResultSet resultSet = statement.executeQuery();

        while(resultSet.next())
        {
            final int id = resultSet.getInt(1);
            final String desc = resultSet.getString(2);
            System.out.print(id + " / " + desc);
        }

        if(resultSet != null) resultSet.close();
        if(statement != null) statement.close();
        if(connection != null) connection.close();
    }
}

这就是配置文件中显示的内容 - 完美运行!

EXEC dbo.SP_ProductSearch  N'ba'

【问题讨论】:

  • 你如何使用普通的 JDBC 来完成这个?
  • 见上面描述的例子
  • 嗯.. 我不了解 MS SQL 日志,但您在 JDBC 示例中使用 autoCommit 模式,它为每个查询执行创建事务。所以我怀疑它是否像你描述的那样有效。
  • 听起来不错!如何禁用自动提交...而不看到消息“No Hibernate Session bound to thread”??

标签: sql-server spring hibernate transactions jtds


【解决方案1】:

你如何调用你的休眠代码(执行存储过程)?是通过带有@Transactional注解的Spring Service类调用的吗?

【讨论】:

  • 是的,我的服务类有@Transactional 注释(在类级别)。如果我将其删除,则会出现此错误:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
  • spring-servlet.xml 包含这些行:<tx:annotation-driven transaction-manager="transactionManager" /><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" />
  • 如果我删除所有事务指令,我仍然会收到 No Hibernate Session bound to thread 错误
【解决方案2】:

我还没有发现任何阻止 Hibernate 使用事务的方法,因此作为一种变通方法,我已切换到运行良好的 MyBatis。

http://www.mybatis.org/spring/index.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多