Dialeto de hibernação incorreto para MSSQL 2014

Estou com um problema ao inserir entidades, que usam sequências, em um banco de dados MSSQL 2014. Eu uso o hibernate que é fornecido com o Wildfly 10 CR4 (mas no CR1 e CR2 eu tenho o mesmo problema).

Aqui estão algumas informações gerais sobre o ambiente de execução do webapp:

Wildfly 10 (CR4)Java 8 e 51Windows 7 Professional 64bitMSSQL Server 2014Driver MSSQL: sqljdbc42.jar é implementado no servidor de aplicativos

Meu arquivo persistence.xml fica assim:

<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>

Agora, aqui está o que acontece quando encontro um erro.

Primeiro, quando o Wildfly é iniciado, vejo este aviso:

WARN [org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver] (Pool de threads do ServerService - 68) HHH000385: Versão principal desconhecida do Microsoft SQL Server [12] usando o dialeto do SQL Server 2000

Examinei a web e descobri que esse problema já é conhecido desde janeiro de 2015, mas infelizmente ainda éuma questão em aberto.

O erro em si é gerado quando tento persistir em uma nova entidade que tenha o ID configurado para usar sequências:

@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;

A exceção levantada é a seguinte:

com.microsoft.sqlserver.jdbc.SQLServerException: nome de objeto inválido „SEQ_MAP_BOOKMARKS”.

Isso não é uma surpresa, pois o hibernate está usando o dialeto errado - aquele que não sabe nada sobre seqüências.

Quando modifico persistence.xml e adiciono esta linha:

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

tudo funciona como um encanto.

O problema é que o aplicativo também funcionará com o banco de dados Oracle em outro servidor e no Postgres em outro. Eu gostaria de evitar a necessidade de preparar várias versões do mesmo aplicativo.

Alguém sabe de uma solução para este problema? Ou devo esperar que outra versão Wildfly e / ou hibernação apareça?

questionAnswers(4)

yourAnswerToTheQuestion