当前位置: 首页 > 面试题库 >

MSSQL 2014错误的休眠方言

姜玉泽
2023-03-14
问题内容

我将使用序列的实体插入MSSQL 2014数据库时遇到问题。我使用Wildfly 10 CR4随附的hibernate模式(但是在CR1和CR2中,我遇到了相同的问题)。

以下是有关Webapp运行环境的一般信息:

  1. Wildfly 10(CR4)
  2. Java 8 u 51
  3. Windows 7专业版64位
  4. MSSQL Server 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](ServerService线程池-68)HHH000385:使用SQL
Server 2000方言的未知Microsoft SQL Server主版本[12]

我在网上浏览后发现,此问题自2015年1月起就已为人所知,但不幸的是,这仍然是一个未解决的问题。

当我尝试保留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和/或hibernate版本出现?


问题答案:

同时团队无法解决此问题,您可以创建一个自定义的方言解析器:

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

}

然后,在持久性单元中进行配置:

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

基于此示例:http : //blog.exxeta.com/2016/03/23/dynamically-resolve-
hibernate-database-dialect/



 类似资料:
  • 问题内容: 我使用Jersey作为Rest Web服务和Hibernate实体管理器来持久化JPA模型。我正在使用Tomcat 8作为容器。 这是persistence.xml文件的内容: 我的Rest呼叫就这么简单: 这是我的web.xml文件 但这给了我这个错误: 我无法弄清楚问题出在哪里!有什么帮助吗? 根据建议,这是mvn依赖项:tree日志: 问题答案: 根据@Ravindran Kan

  • 问题内容: 我正在尝试从当前日期在任何给定月份的第一天和最后一天之间的表中提取信息。 我收到运行时错误“命名查询中的错误:Department.byDate” 我正在向您提供我认为可能导致问题的代码,如果需要任何其他代码,请在评论中告知我。 我的命名查询如下所示: 我在DAO中以一种类似于以下方式的方法使用此命名查询: 我获取月份的第一天和最后几天的方法如下: 问题答案: 在HQL / JPQL中

  • 问题内容: 我收到错误消息: org.hibernate.TypeMismatchException:为类BEntity提供了错误类型的ID。预期:类BEntity,得到类AEntity HQL查询: hibernate源代码 当我在SQL Explorer中运行代码时,只能在代码中运行它会导致问题… 问题答案: 看来这是hibernate3.2.6版中的一个缺陷,该缺陷仍未解决。碰到了这个JIR

  • 问题内容: 什么是最佳解决方案? 制作视频的人相信 在许多情况下,hibernate过大 基本的sql是一种很好的语言,它可以使hibernate抽象化 我听说过其他一些ORM实现,例如 https://github.com/rufiao/persist http://ormlite.com/ http://www.simpleorm.org/ 我想听听他们如何比较,以及每个人的优缺点。 问题答案

  • 问题内容: 我有一个问题,就是mysql中datediff的语法与hsqldb中的语法不同: hibernate中的方言通常可以解决这些问题,但是我似乎无法找到为hibernate创建datediff限制的方法。这是真正的麻烦,因为它使我无法使用内存中的hsql数据库进行单元测试,因为我必须在sql语句中“硬编码” datediff的格式。 如果有人对此事有任何建议,将不胜感激。 问题答案: 我会

  • 问题内容: 我在MySQL中有一个ID字段类型为BIGINT的表 在hibernate对象中,我为此字段使用Java Long类型 但是当运行程序时,它会抛出异常: 如何在hibernate状态下映射MySQL BINGINT数据类型? 问题答案: 但是在运行程序时,它将引发异常:预期:类java.lang.Long,得到类java.lang.Integer 为BIGINT 使用a 是正确的,上述