Ho un problema con l'inserimento di entità che utilizzano sequenze in un database MSSQL 2014. Uso Hibernate fornito con Wildfly 10 CR4 (ma in CR1 e CR2 ho avuto lo stesso problema).Dialetto di ibernazione errato per MSSQL 2014
Ecco un'informazioni generali sull'ambiente corsa webapp:
- wildfly 10 (CR4)
- Java 8 u 51
- Windows 7 Proffesional 64bit
- MSSQL Server 2014
- MSSQL driver: sqljdbc42.jar è distribuito sul server delle applicazioni
Il mio file persistence.xml si presenta così:
<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>
Ora qui è quello che succede quando mi imbatto in un errore.
In primo luogo, quando viene avviato wildfly, posso vedere questo avvertimento:
WARN [org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver] (ServerService pool di thread - 68) HHH000385: Unknown Microsoft Versione principale di SQL Server [12] utilizzando il dialetto SQL Server 2000
Ho controllato il web e ho scoperto che questo problema è già noto da gennaio 2015, ma sfortunatamente è ancora an open issue.
L'errore si è sollevata quando provo a persistere una nuova entità che ha l'ID configurato per utilizzare le sequenze:
@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'eccezione sollevata è la seguente:
com.microsoft.sqlserver .jdbc.SQLServerException: nome oggetto non valido "SEQ_MAP_BOOKMARKS".
Questa non è una sorpresa poiché l'ibernazione usa il dialetto sbagliato, quello che non sa nulla delle sequenze.
Quando modifico persistence.xml e aggiungi questa linea:
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2012Dialect"/>
tutto funziona come un fascino.
Il problema è che l'applicazione funzionerà anche con il database Oracle su un altro server e su Postgres su un altro. Mi piacerebbe evitare di dover preparare più versioni della stessa applicazione.
Qualcuno sa di una soluzione a questo problema? O dovrei aspettare che venga visualizzata un'altra versione di Wildfly e/o di ibernazione?
estrarre il valore "" org.hibernate.dialect.SQLServer2012Dialect "" in un file di proprietà. Metti questo file nella cartella conf del tomcat. Utilizzare i segnaposti di primavera per impostare il dialetto. Con questa configurazione è possibile distribuire la guerra sui due server diversi e si deve solo modificare il file delle proprietà nel tomcat. –