gpt4 book ai didi

java - MSSQL 2014 的错误 hibernate 方言

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:29 26 4
gpt4 key购买 nike

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

以下是关于 webapp 运行环境的一般信息:

  1. 野蝇 10 (CR4)
  2. Java 8 至 51
  3. Windows 7 专业版 64 位
  4. MSSQL 服务器 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 启动时,我可以看到这个警告:

WARN [org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver](ServerService 线程池 -- 68)HHH000385:未知的 Microsoft SQL Server 主要版本 [12] 使用 SQL Server 2000 方言

翻了一下网络,发现这个问题从2015年1月就已经知道了,可惜还是an open issue .

当我尝试保留一个 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/

关于java - MSSQL 2014 的错误 hibernate 方言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33521144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com