hibernate的session获取到的是一个代理链接,在使用jdbc来做数组存储过程的时候会类型转换错误,有谁知道hibernate的怎么获取数据库的原始链接么·

解决方案 »

  1.   

    jdbc来做数组存储过程 获取数据库的原始链接  是什么意思 说明白点。。
      

  2.   


    我需要用做存储过程,过程的参数分别有传入和传出的数组oracle.sql.ARRAY,hibernate找了好久资料,还是不知道怎么去做这个存储过程,然后改用jdbc来做,jdbc在的ARRAY需要先从数据库准备这样的类型,hibernate的数据库链接是代理的,不是原始的数据库链接,所以在ARRAY转型会类型转换错误
      

  3.   


    试过了,还是没用,如果你知道hibernate怎么去调用带数组参数的存储过程,那真是极好的·
      

  4.   

    我不知道你为什么说hibernate的session获得的链接是一个代理链接。
    session.doWork(new Work() {
    public void execute(Connection connection) throws SQLException {
    System.out.println(connection.getClass());
    }
    });
    确实打印出来是class com.mysql.jdbc.Connection
    那么他用的这个Connection和你JDBC得到的Connection有什么区别呢?
      

  5.   

    hibernate的是代理。。jdbc的是原始的
      

  6.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?
      

  7.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?
      

  8.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?你的意思是就因为hibernate是对JDBC的封装所以我们直接在Hibernate里面用JDBC就不是直接用JDBC了?那hibernate提供doWork方法是用来干嘛的?那session里面绑定的那个Connection就不是JDBC里面那个javax.sql.Connection了?
      

  9.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?你的意思是就因为hibernate是对JDBC的封装所以我们直接在Hibernate里面用JDBC就不是直接用JDBC了?那hibernate提供doWork方法是用来干嘛的?那session里面绑定的那个Connection就不是JDBC里面那个javax.sql.Connection了?你跟我这样吵有什么意义、ssssion那个先不谈过期,就是拿到了也是个代理链接,dowork实现,你不嫌麻烦我还嫌麻烦。
    你自己去试试好吧,用jdbc调用数组参数的存储过程,和hibernate的connection去调用,看是不是一样,别再这里进行无谓的争论
      

  10.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?你的意思是就因为hibernate是对JDBC的封装所以我们直接在Hibernate里面用JDBC就不是直接用JDBC了?那hibernate提供doWork方法是用来干嘛的?那session里面绑定的那个Connection就不是JDBC里面那个javax.sql.Connection了?你跟我这样吵有什么意义、ssssion那个先不谈过期,就是拿到了也是个代理链接,dowork实现,你不嫌麻烦我还嫌麻烦。
    你自己去试试好吧,用jdbc调用数组参数的存储过程,和hibernate的connection去调用,看是不是一样,别再这里进行无谓的争论
    首先,你的想法跟我的想法不一致,所以我想弄清楚是不是我之前的理解是有问题的,所以我才一直问你是怎么思考的,如果你觉得这个就是我跟你吵,好吧,你可以不用理我。如果你觉得我说的还有点道理,那么我们接着讨论。
    1,session那个先不谈过期,因为我不太了解你是怎么得到connection的,所以我不太理解你说的这里的过期是指什么,能不能解释的详细一点?
    2,你题目说的是hibernate获取原始的数据链接,所以我告诉你用doWork得到的就是原始的链接,你说不是,好嘛。
    3,好吧,假如你说的是在SSH下,那么doWork里面得到的connection确实不是本身的connection,是因为你的Connection由DataSource提供(也不是说这个connection是hibernate代理过的,而是你的datasource包装的),我不知道你用的是什么datasource,我就说说我的吧,我用的是DBCP,所以得到的是装饰(不是代理)之后的对象:PoolGuardConnectionWrapper,好吧,这个对象是private的,所以得到真实的对象需要:
    sessionFactory.getCurrentSession().doWork(new Work() {
    public void execute(Connection connection) throws SQLException {
    if(connection instanceof DelegatingConnection){
    DelegatingConnection dc=(DelegatingConnection)connection;
    System.out.println(dc.getInnermostDelegate().getClass());
    }
    }
    });
    好吧,如果你打印出来是null的话,DBCP默认情况下是不允许直接访问最底层的connection对象的,设置accessToUnderlyingConnectionAllowed=true
    然后得到的就是真正的数据库连接了。好了,我的话说完了,我不知道我的这种解决方式是不是最好的,有没有额外的bug,我只是想跟你讨论问题而已。
      

  11.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?你的意思是就因为hibernate是对JDBC的封装所以我们直接在Hibernate里面用JDBC就不是直接用JDBC了?那hibernate提供doWork方法是用来干嘛的?那session里面绑定的那个Connection就不是JDBC里面那个javax.sql.Connection了?你跟我这样吵有什么意义、ssssion那个先不谈过期,就是拿到了也是个代理链接,dowork实现,你不嫌麻烦我还嫌麻烦。
    你自己去试试好吧,用jdbc调用数组参数的存储过程,和hibernate的connection去调用,看是不是一样,别再这里进行无谓的争论
    首先,你的想法跟我的想法不一致,所以我想弄清楚是不是我之前的理解是有问题的,所以我才一直问你是怎么思考的,如果你觉得这个就是我跟你吵,好吧,你可以不用理我。如果你觉得我说的还有点道理,那么我们接着讨论。
    1,session那个先不谈过期,因为我不太了解你是怎么得到connection的,所以我不太理解你说的这里的过期是指什么,能不能解释的详细一点?
    2,你题目说的是hibernate获取原始的数据链接,所以我告诉你用doWork得到的就是原始的链接,你说不是,好嘛。
    3,好吧,假如你说的是在SSH下,那么doWork里面得到的connection确实不是本身的connection,是因为你的Connection由DataSource提供(也不是说这个connection是hibernate代理过的,而是你的datasource包装的),我不知道你用的是什么datasource,我就说说我的吧,我用的是DBCP,所以得到的是装饰(不是代理)之后的对象:PoolGuardConnectionWrapper,好吧,这个对象是private的,所以得到真实的对象需要:
    sessionFactory.getCurrentSession().doWork(new Work() {
    public void execute(Connection connection) throws SQLException {
    if(connection instanceof DelegatingConnection){
    DelegatingConnection dc=(DelegatingConnection)connection;
    System.out.println(dc.getInnermostDelegate().getClass());
    }
    }
    });
    好吧,如果你打印出来是null的话,DBCP默认情况下是不允许直接访问最底层的connection对象的,设置accessToUnderlyingConnectionAllowed=true
    然后得到的就是真正的数据库连接了。好了,我的话说完了,我不知道我的这种解决方式是不是最好的,有没有额外的bug,我只是想跟你讨论问题而已。你还是先试试吧,不要跟我说打印出来或者什么得到的是sql包下的,就看使用,我要的是使用,不是理论,理论上都是同一个包同一个接口,jdbc得到的能用于ARRAY的oracle数据获取,而hibernate不行,我这么说你应该知道,我在这边找解决方案,而你要我跟我去纠结原不原始,请问你就算是对的,对我来说能解决问题?
      

  12.   

    不就是你那个arrayDescriptor需要一个connection作为参数吗。
    jdbc的API写在哪里不行?写在hibernate里也一样用,自己注意一下事务就可以。
      

  13.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?你的意思是就因为hibernate是对JDBC的封装所以我们直接在Hibernate里面用JDBC就不是直接用JDBC了?那hibernate提供doWork方法是用来干嘛的?那session里面绑定的那个Connection就不是JDBC里面那个javax.sql.Connection了?你跟我这样吵有什么意义、ssssion那个先不谈过期,就是拿到了也是个代理链接,dowork实现,你不嫌麻烦我还嫌麻烦。
    你自己去试试好吧,用jdbc调用数组参数的存储过程,和hibernate的connection去调用,看是不是一样,别再这里进行无谓的争论
    首先,你的想法跟我的想法不一致,所以我想弄清楚是不是我之前的理解是有问题的,所以我才一直问你是怎么思考的,如果你觉得这个就是我跟你吵,好吧,你可以不用理我。如果你觉得我说的还有点道理,那么我们接着讨论。
    1,session那个先不谈过期,因为我不太了解你是怎么得到connection的,所以我不太理解你说的这里的过期是指什么,能不能解释的详细一点?
    2,你题目说的是hibernate获取原始的数据链接,所以我告诉你用doWork得到的就是原始的链接,你说不是,好嘛。
    3,好吧,假如你说的是在SSH下,那么doWork里面得到的connection确实不是本身的connection,是因为你的Connection由DataSource提供(也不是说这个connection是hibernate代理过的,而是你的datasource包装的),我不知道你用的是什么datasource,我就说说我的吧,我用的是DBCP,所以得到的是装饰(不是代理)之后的对象:PoolGuardConnectionWrapper,好吧,这个对象是private的,所以得到真实的对象需要:
    sessionFactory.getCurrentSession().doWork(new Work() {
    public void execute(Connection connection) throws SQLException {
    if(connection instanceof DelegatingConnection){
    DelegatingConnection dc=(DelegatingConnection)connection;
    System.out.println(dc.getInnermostDelegate().getClass());
    }
    }
    });
    好吧,如果你打印出来是null的话,DBCP默认情况下是不允许直接访问最底层的connection对象的,设置accessToUnderlyingConnectionAllowed=true
    然后得到的就是真正的数据库连接了。好了,我的话说完了,我不知道我的这种解决方式是不是最好的,有没有额外的bug,我只是想跟你讨论问题而已。你还是先试试吧,不要跟我说打印出来或者什么得到的是sql包下的,就看使用,我要的是使用,不是理论,理论上都是同一个包同一个接口,jdbc得到的能用于ARRAY的oracle数据获取,而hibernate不行,我这么说你应该知道,我在这边找解决方案,而你要我跟我去纠结原不原始,请问你就算是对的,对我来说能解决问题?我无语了,你看了我的回复没有?我代码也给你贴出来了,我自己测试也通过了。你想要的方案我的解决方案也给你了。你试试我的看行不行啊。行那就OK,不行我们再想办法解决。
      

  14.   

    hibernate的是代理。。jdbc的是原始的
    请问为什么你说hibernate的是代理,jdbc的是原始的?hibernate对jdbc进行封装的,jdbc都不是原始的 难道hibernate还是原始的?你的意思是就因为hibernate是对JDBC的封装所以我们直接在Hibernate里面用JDBC就不是直接用JDBC了?那hibernate提供doWork方法是用来干嘛的?那session里面绑定的那个Connection就不是JDBC里面那个javax.sql.Connection了?你跟我这样吵有什么意义、ssssion那个先不谈过期,就是拿到了也是个代理链接,dowork实现,你不嫌麻烦我还嫌麻烦。
    你自己去试试好吧,用jdbc调用数组参数的存储过程,和hibernate的connection去调用,看是不是一样,别再这里进行无谓的争论
    首先,你的想法跟我的想法不一致,所以我想弄清楚是不是我之前的理解是有问题的,所以我才一直问你是怎么思考的,如果你觉得这个就是我跟你吵,好吧,你可以不用理我。如果你觉得我说的还有点道理,那么我们接着讨论。
    1,session那个先不谈过期,因为我不太了解你是怎么得到connection的,所以我不太理解你说的这里的过期是指什么,能不能解释的详细一点?
    2,你题目说的是hibernate获取原始的数据链接,所以我告诉你用doWork得到的就是原始的链接,你说不是,好嘛。
    3,好吧,假如你说的是在SSH下,那么doWork里面得到的connection确实不是本身的connection,是因为你的Connection由DataSource提供(也不是说这个connection是hibernate代理过的,而是你的datasource包装的),我不知道你用的是什么datasource,我就说说我的吧,我用的是DBCP,所以得到的是装饰(不是代理)之后的对象:PoolGuardConnectionWrapper,好吧,这个对象是private的,所以得到真实的对象需要:
    sessionFactory.getCurrentSession().doWork(new Work() {
    public void execute(Connection connection) throws SQLException {
    if(connection instanceof DelegatingConnection){
    DelegatingConnection dc=(DelegatingConnection)connection;
    System.out.println(dc.getInnermostDelegate().getClass());
    }
    }
    });
    好吧,如果你打印出来是null的话,DBCP默认情况下是不允许直接访问最底层的connection对象的,设置accessToUnderlyingConnectionAllowed=true
    然后得到的就是真正的数据库连接了。好了,我的话说完了,我不知道我的这种解决方式是不是最好的,有没有额外的bug,我只是想跟你讨论问题而已。你还是先试试吧,不要跟我说打印出来或者什么得到的是sql包下的,就看使用,我要的是使用,不是理论,理论上都是同一个包同一个接口,jdbc得到的能用于ARRAY的oracle数据获取,而hibernate不行,我这么说你应该知道,我在这边找解决方案,而你要我跟我去纠结原不原始,请问你就算是对的,对我来说能解决问题?我无语了,你看了我的回复没有?我代码也给你贴出来了,我自己测试也通过了。你想要的方案我的解决方案也给你了。你试试我的看行不行啊。行那就OK,不行我们再想办法解决。不是的呀,我们不讨论它到底是否原始链接,就谈论,从hibernate中拿出的connection在使用jdbc做数据库数组存储的时候,connection转换异常是咋回事
      

  15.   


    jdbc的可以的。hibernate拿到的connection是不行的,我不知道怎么又和事务扯上关系了,难道是没开启事务? 那也不至于报错类型转换错误呀
      

  16.   


    jdbc的可以的。hibernate拿到的connection是不行的,我不知道怎么又和事务扯上关系了,难道是没开启事务? 那也不至于报错类型转换错误呀
    中国字都看不明白吗?
    你自己从hibernate里拿到连库属性,自己写jdbc代码连接数据库操作你那破类型不行吗?这么操作也就是事务和hibernate不一定一致,自己写几行代码管理事务。
      

  17.   


    jdbc的可以的。hibernate拿到的connection是不行的,我不知道怎么又和事务扯上关系了,难道是没开启事务? 那也不至于报错类型转换错误呀
    中国字都看不明白吗?
    你自己从hibernate里拿到连库属性,自己写jdbc代码连接数据库操作你那破类型不行吗?这么操作也就是事务和hibernate不一定一致,自己写几行代码管理事务。我看不懂行了吧?好笑,你试过么?没试过不要叫别人试