Mal hibernate dialecte pour MSSQL 2014

J'ai un problème avec l'insertion d'entités, qui utilisent des séquences, à un MSSQL 2014 de la base de données. J'utilise hibernate qui est livré avec Wildfly 10 CR4 (mais en CR1 et CR2 j'ai eu le même problème).

Ici est une information générale sur la webapp exécuter environnement:

  1. Wildfly 10 (CR4)
  2. Java 8 u 51
  3. Windows 7 Proffesional 64bit
  4. MSSQL Server 2014
  5. MSSQL pilote: sqljdbc42.jar est déployé sur le serveur d'application

Mon persistence.xml fichier ressemble à ceci:

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

Maintenant, voici ce qui arrive lorsque je rencontre une erreur.

Tout d'abord, lors de Wildfly est commencé, je peux voir cet avertissement:

WARN [org.mise en veille prolongée.moteur.jdbc.le dialecte.interne.StandardDialectResolver] (ServerService Pool de Threads -- 68) HHH000385: Inconnu Microsoft SQL Server version majeure [12] à l'aide de SQL Server 2000 dialecte

J'ai regardé à travers le web et découvert que ce problème est déjà connu depuis le mois de janvier 2015, mais il est malheureusement encore une question ouverte.

L'erreur elle-même est déclenché lorsque j'essaie de conserver une nouvelle entité qui a l'ID configuré pour utiliser des séquences:

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

L'exception soulevée est la suivante:

com.microsoft.sqlserver.jdbc.SQLServerException: nom d'objet non Valide "SEQ_MAP_BOOKMARKS".

Ce n'est pas une surprise puisque hibernate est l'utilisation de la mauvaise dialecte - celui qui ne sait rien à propos de séquences.

Quand je modifie persistence.xml et ajouter cette ligne:

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

tout fonctionne comme un charme.

Le problème est que l'application fonctionne également avec la base de données Oracle sur un autre serveur et sur Postgres sur l'autre. J'aimerais éviter d'avoir à préparer plusieurs versions de la même application.

Quelqu'un connais une solution à ce problème ? Ou dois-je attendre pour un autre Wildfly et/ou mise en veille prolongée version apparaissent ?

Extraire la valeur ""org.mise en veille prolongée.le dialecte.SQLServer2012Dialect"" pour un fichier de propriétés. Placez ce fichier dans le dossier conf de tomcat. Utiliser le printemps des espaces réservés pour définir le dialecte. Avec cette configuration, vous pouvez déployer la guerre sur les deux serveurs différents, et vous avez seulement changer le fichier de propriétés dans le tomcat.

OriginalL'auteur Marcin Roguski | 2015-11-04