2015-11-04 43 views
5

我有一個將使用序列的實體插入MSSQL 2014數據庫的問題。我使用Wildfly 10 CR4附帶的休眠(但在CR1和CR2中,我遇到了同樣的問題)。MSSQL 2014錯誤的休眠方言

這裏是關於Web應用程序運行環境的一般信息:

  1. Wildfly 10(CR4)
  2. 的Java 8ü51
  3. Windows 7的業餘體校64
  4. MSSQL服務器2014
  5. MSSQL驅動程序:sqljdbc42.jar部署在應用程序服務器上

我的persistence.xml文件如下所示:

<persistence-unit name="mb_managed_pu" transaction-type="JTA"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <jta-data-source>java:/jdbc/datasource</jta-data-source> 
    <properties> 
     <property name="hibernate.archive.autodetection" value="class, hbm" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.jdbc.batch_size" value="0" /> 
     <property name="hibernate.default_schema_" value="openmap"/> 
     <property name="hibernate.connection.useUnicode" value="yes"/> 
     <property name="hibernate.connection.characterEncoding" value="UTF-8"/> 
    </properties> 
</persistence-unit> 

現在,我遇到錯誤時會發生什麼情況。

首先,當Wildfly開始時,我可以看到這樣的警告:

警告[org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver(Server服務線程池 - 68)HHH000385:未知微軟SQL Server主要版本[12]使用SQL Server 2000方言

我查看了網絡,發現這個問題自2015年1月以來就已知曉,但不幸的是它仍然是an open issue

當我嘗試堅持具有ID配置爲使用序列的新的實體本身的上升的錯誤:

@Id 
@Column(name = "MAP_BOOKMARK_ID") 
@SequenceGenerator(name = "SEQ_MAP_BOOKMARKS", sequenceName = "SEQ_MAP_BOOKMARKS", allocationSize = 1) 
@GeneratedValue(generator = "SEQ_MAP_BOOKMARKS", strategy = GenerationType.SEQUENCE) 
private long     id; 

提出的例外如下:

com.microsoft.sqlserver .jdbc.SQLServerException:無效的對象名稱「SEQ_MAP_BOOKMARKS」。

這並不令人意外,因爲hibernate使用了錯誤的方言 - 對序列一無所知的方言。

當我修改的persistence.xml並添加此行:

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2012Dialect"/> 

一切就像一個魅力。

問題是,該應用程序還可以與另一臺服務器上的Oracle數據庫以及另一臺服務器上的Postgres一起使用。我想避免必須準備同一應用程序的多個版本。

有沒有人知道這個問題的解決方案?還是應該等待另一個Wildfly和/或休眠版本出現?

+2

值「」 org.hibernate.dialect.SQLServer2012Dialect「」提取到一個屬性文件。將此文件放在tomcat的conf文件夾中。使用彈簧佔位符來設置方言。通過這種配置,您可以將戰爭部署到兩臺不同的服務器上,並且只需要更改tomcat中的屬性文件。 –

回答

3

與此同時,球隊並沒有解決這個問題,你可以創建自定義方言解析:

public class ScopeStandardDialectResolver implements DialectResolver { 


private static final long serialVersionUID = 1L; 

    @Override 
    public Dialect resolveDialect(DialectResolutionInfo info) { 
     Dialect customDialectResolver = customDialectResolver(info); 
     Log.getInstance().logInfo(Thread.currentThread().getStackTrace(), customDialectResolver.getClass().getName()); 
     return customDialectResolver; 
    } 

    private Dialect customDialectResolver(DialectResolutionInfo info) { 
     final String databaseName = info.getDatabaseName(); 
     final int majorVersion = info.getDatabaseMajorVersion(); 
     if (isSqlServer2014(databaseName, majorVersion)) { 
      return new SQLServer2012Dialect(); 
     } else { 
      return StandardDialectResolver.INSTANCE.resolveDialect(info); 
     } 
    } 

    private boolean isSqlServer2014(final String databaseName, final int majorVersion) { 
     return databaseName.startsWith("Microsoft SQL Server") && majorVersion == 12; 
    } 

} 

然後你在你的持久化單元配置:

基於在此實例中10
<property name="hibernate.dialect_resolvers" value="com.oki.scope.hibernate.ScopeStandardDialectResolver" /> 

http://blog.exxeta.com/2016/03/23/dynamically-resolve-hibernate-database-dialect/

2

我認爲你的問題可能與這個已知問題HHH-9570有關。(該鏈接實際上包含我對我建議的解決方法的拉取請求)

基本上,正如之前發生的SQL Server 2012一樣,Hibernate的StandardDialectResolver不能識別SQL Server 2014([Major版本12]),然後是默認方言SQLServerDialect返回,這是一個用於SQL Server 2000

-5

實際上這個問題就來了,由於表格的非正確映射。檢查表和實體類映射。

1

對於Springboot 1.4.7和下添加以下屬性文件

spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.SQLServer2012Dialect