2016-09-23 99 views
1

我使用jtds驅動程序從SpringBoot + JPA應用程序使用Windows身份驗證從UnixBox連接到SQLServer。它是一個獨立的應用程序,而不是一個基於Web的應用程序。我能夠成功地連接到相同的,但是當我嘗試保存一些數據使用JPARepository,我收到以下異常:使用jtds進行SqlServer連接時出現異常

java.lang.AbstractMethodError: null 
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setCharacterStream(JtdsPreparedStatement.java:1274) ~[jtds-1.3.1.jar:1.3.1] 

我查了相應的源代碼JtdsPreparedStatement,發現沒有執行對於此方法:

@Override 
public void setCharacterStream(int parameterIndex, Reader reader, 
     long length) throws SQLException { 
    // TODO Auto-generated method stub 
    throw new AbstractMethodError(); 
} 

如建議here;我們可以執行相同的操作,它應該可以工作。有人能解釋我怎麼能註冊我的實現JtdsPreparedStatement在運行時被Spring容器挑選出來而不是默認的?或者如果有其他選項可用?

編輯JtdsPreparedStatement有一個默認範圍的構造函數;甚至不能延長它

回答

0

這是一個開放的jTDS bug。總之,JDBC標準規定了用於設置字符流兩種不同的方法:

舊方法簽名:

public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException 

新方法簽名:

public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException 

在差是這是最後一個參數從long更改爲int。

jTDS尚未實現Hibernate使用的新方法,因此您將得到AbstractMethodError。

你有2個選擇這裏:

  1. 切換到微軟的JDBC驅動程序,支持此方法
  2. 獲取JTDS的源代碼,並通過轉發的老方法將實現自己的方法(最有可能的新方法)

根據我的經驗,不要指望很快就能正式發佈。