3

对于我们的 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
  • 微软 SQL 服务器 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'
4

2 回答 2

0

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

于 2012-11-15T02:30:59.483 回答
0

我还没有发现任何阻止 Hibernate 使用事务的方法,所以作为一种解决方法,我已经切换到运行良好的 MyBatis。

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

于 2012-11-19T20:45:41.473 回答