Tengo un problema con la inserción de las entidades, que el uso de las secuencias, en un MSSQL 2014 de la base de datos. Puedo usar el modo de hibernación que se entregan con Wildfly 10 CR4 (pero en CR1 y CR2 tengo el mismo problema).

Aquí es una información general sobre la webapp entorno de ejecución:

  1. Wildfly 10 (CR4)
  2. Java 8 u 51
  3. Windows 7 Profesional de 64 bits
  4. MSSQL Server 2014
  5. MSSQL controlador: sqljdbc42.jar se implementa en el servidor de aplicaciones

Mi persistence.xml el archivo se parece a esto:

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

Ahora aquí es lo que pasa cuando me encuentro con un error.

Primero, cuando Wildfly se inicia, puedo ver esta advertencia:

ADVERTIR [org.hibernate.motor.jdbc.dialecto.interna.StandardDialectResolver] (ServerService Hilo de la Piscina-68) HHH000385: Desconocido de Microsoft SQL Server versión principal [12] el uso de SQL Server 2000 dialecto

Me miró a través de la web y se encontró que este problema ya es conocido desde enero de 2015, pero por desgracia todavía es una cuestión abierta.

El error en sí mismo se produce cuando trato de persistir en una nueva entidad que tiene el ID configurado para utilizar secuencias:

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

La excepción planteada es la siguiente:

com.microsoft.sqlserver.jdbc.SQLServerException: nombre de objeto no Válido «SEQ_MAP_BOOKMARKS».

Esto no es una sorpresa ya que hibernate es la utilización incorrecta de dialecto – el que no sabe nada acerca de las secuencias.

Cuando puedo modificar persistence.xml y añadir esta línea:

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

todo funciona como un encanto.

El problema es que la aplicación también funciona con Oracle de base de datos en otro servidor y en Postgres en otro. Me gustaría evitar tener que preparar varias versiones de la misma aplicación.

¿Alguien sabe de una solución a este problema ? O debo esperar a otro Wildfly y/o hibernate versión a aparecer ?

Extraer el valor «»org.hibernate.dialecto.SQLServer2012Dialect»» para un archivo de propiedades. Coloque este archivo en la carpeta conf del tomcat. Uso primavera marcadores de posición para establecer el dialecto. Con esta configuración se puede implementar de la guerra en los dos servidores diferentes, y usted tiene sólo tienen que cambiar el archivo de propiedades en el tomcat.

OriginalEl autor Marcin Roguski | 2015-11-04

4 Comentarios

  1. 5

    Mientras tanto, el equipo no resolver este problema, puede crear una personalizada dialecto de resolución:

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

    A continuación, configurar en su unidad de persistencia:

    <property name="hibernate.dialect_resolvers" value="com.oki.scope.hibernate.ScopeStandardDialectResolver" />

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

    OriginalEl autor Rodrigo Menezes

  2. 2

    Creo que su problema podría estar relacionado con este problema conocido HHH-9570. (El enlace contiene en realidad mi solicitud de extracción a mi propuesta de solución)

    Básicamente, como sucedió antes con SQL Server 2012, la StandardDialectResolver de Hibernate no reconocer SQL Server 2014 ([versión Principal 12]) y, a continuación, el valor predeterminado dialecto SQLServerDialect se devuelve, que es el uno para SQL Server 2000

    OriginalEl autor garodriguezlp

  3. 2

    Para Springboot 1.4.7 y los inferiores de abajo para agregar un archivo de propiedades

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

    OriginalEl autor Rashad Saif

  4. -5

    Realidad, este problema viene debido a la no asignación correcta de las tablas. De mesas, y la clase de Entidad de las asignaciones.

    OriginalEl autor user6788533

Dejar respuesta

Please enter your comment!
Please enter your name here