Hibernate 4 -> 5 迁移:NamingStrategy 更改,找不到表

2023-12-26

我想做的事

我正在尝试从 WildFly 8.2.0 迁移到 WildFly 10.0.0,这意味着我已经(并且想要)从 Hibernate 4.3 迁移到 Hibernate 5.0。

Setup

Java 8u40 
Spring 4.1.9 
SQL Server 2012
Wildfly 8.2.0 -> Wildfly 10.0.0 
Hibernate 4.3.6 -> Hibernate 5.0.7

我已阅读迁移指南 https://github.com/hibernate/hibernate-orm/blob/5.0/migration-guide.adoc我被击中了命名策略变化。我have https://stackoverflow.com/questions/33111949/hibernate-5-implicitnamingstrategy read https://stackoverflow.com/questions/32864327/migrating-to-hibernate-5 many https://stackoverflow.com/questions/32165694/spring-hibernate-5-naming-strategy-configuration 问题 https://stackoverflow.com/questions/32437202/improvednamingstrategy-no-longer-working-in-hibernate-5关于这个,但我的似乎有点不同。 Hibernate 抱怨找不到表:

INFO [o.h.Version] HHH000412: Hibernate Core {5.0.7.Final}
INFO [o.h.cfg.Environment] HHH000206: hibernate.properties not found
INFO [o.h.cfg.Environment] HHH000021: Bytecode provider name : javassist
INFO [o.h.annotations.common.Version] HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
INFO [o.h.dialect.Dialect] HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
INFO [o.h.envers.boot.internal.EnversServiceImpl] Envers integration enabled? : true
INFO [o.h.validator.internal.util.Version] HV000001: Hibernate Validator 5.2.3.Final
INFO [o.h.tool.hbm2ddl.SchemaValidator] HHH000229: Running schema validator
INFO [o.h.t.s.e.i.InformationExtractorJdbcDatabaseMetaDataImpl] HHH000262: Table not found: SEC_AUTHORIZATION_RULES
INFO [o.h.t.s.e.i.InformationExtractorJdbcDatabaseMetaDataImpl] HHH000262: Table not found: SEC_USER
More tables not found ...
INFO [o.h.hql.internal.QueryTranslatorFactoryInitiator] (ServerService Thread Pool -- 62) HHH000397: Using ASTQueryTranslatorFactory

当我切换到调试日志记录时,我看到他正在将实体绑定到正确的数据库表:

DEBUG [o.h.c.a.EntityBinder] Bind entity com.company.user.User on table SEC_USER
DEBUG [o.h.c.Ejb3Column] Binding column: Ejb3Column{table=org.hibernate.mapping.Table(SEC_USER), mappingColumn=ID, insertable=true, updatable=true, unique=false}

对我来说奇怪的是该应用程序可以运行。在这之后Table not found它不会抱怨模式不正确。该应用程序有效。选择、插入、更新数据有效。

我通过它的 spring-orm 抽象配置了 hibernate:

@Bean(name = "myEmf")
@DependsOn({"dataSource", "flyway"})
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[]{"com.company.**.*"});
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    em.setJpaProperties(additionalProperties());
    return em;
}

private Properties additionalProperties() {
  Properties propFile = propertiesFile();
  properties.setProperty("hibernate.hbm2ddl.auto", "validate");
  properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect");
  properties.setProperty("hibernate.show_sql", "false");
  properties.setProperty("hibernate.format_sql", "true");
  properties.setProperty("hibernate.id.new_generator_mappings", "false");
  properties.setProperty("hibernate.use_sql_comments", "false");
  properties.setProperty("hibernate.implicit_naming_strategy", "legacy-jpa");
  return properties;
}

在这个对应的实体中,我有明确命名的表名和列名:

@Entity
@Table(name = "SEC_USER")
public class User extends BaseEntity {

   @Column(name = "LOGIN", nullable = false, unique = true)
   private String login;

问题

  • 如何让这个表未找到的日志消息消失?
  • 如果我有明确命名的表名,为什么它们会出现?
  • 他为什么不抱怨栏名呢?
  • 为什么他是看起来工作正常?

我尝试过什么

  • 将 Spring 4.1.9 升级到 4.2.5说他支持 Hibernate 5 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.2.html#_data_access_improvements
  • Set hibernate.implicit_naming_strategy to 遗留-jpa根据this http://in.relation.to/2015/08/05/hibernate-orm-500-cr4-release/
  • Set manually the default schema and assigned the role db_owner. Note i never had to do this before with hibernate 4. enter image description here

  • I have debugged hibernate a bit and what i found in the InformationExtractorJdbcDatabaseMetaDataImpl.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java that hibernate does not see the catalog (whatever this is) and schema. At leat i think he should see the schema. See screenshot below: catalog and schema are null. enter image description here


我正在解决同样的问题,但是jtds司机。经过一番研究,我发现,冬眠与SqlServerDialect uses sp_tables用于查找表声明的存储过程。在该 SP 中,第二个参数是架构名称,因此,如果是null表搜索工作正常,如果它是空字符串 - 则不能。

Hibernate将此参数设置为null分两种情况:

  • 如果方言方法getNameQualifierSupport()回报NameQualifierSupport.CATALOG,但所有 SqlServerDialects 返回null
  • 如果司机回来false在“supportsSchemasInTableDefinitions()”方法中,但是jtds回报true.

为了解决这个问题,我决定延长SqlServer2012Dialect结束覆盖getNameQualifierSupport() method.

public class SqlServer2012DialectWithCatalogOnly extends SQLServer2012Dialect {
    @Override
    public NameQualifierSupport getNameQualifierSupport() {
        return NameQualifierSupport.CATALOG;
    }
}

并设置属性hibernate.dialect到新班级org.company.SqlServer2012DialectWithCatalogOnly

希望这可以帮助...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 4 -> 5 迁移:NamingStrategy 更改,找不到表 的相关文章

随机推荐

  • 从存储库 Databricks 中的另一个笔记本运行笔记本

    我有一个笔记本 其功能位于存储库文件夹中 我试图在另一个笔记本中运行它 通常我可以这样运行它 run Users name project file name 因此 我将这两个文件 function notebook processed n
  • 是否可以执行 If Else 或 Switch 语句 Firestore 规则

    是否可以在 firestore 规则中执行 Switch 语句或 if else 我试图寻找它 但没有找到答案 我尝试的是 function getTier return get users request auth uid data us
  • Synology 网站简单的“hello world”快速入门使用 python、flask 和 uwsgi

    我注意到 Synology 的本机网站使用 uwsgi 框架 最近添加了对 python 脚本的支持 我想知道是否有人可以帮我找出一个简单的 hello world 示例 我不清楚 uwsgi 文件中应放入什么内容 我按照 uwsgi 文档
  • 这种锁定技术的名称是什么?

    我有一个巨大的 Trove 地图和一个需要从多个线程经常调用的方法 大多数时候这个方法会返回true 线程正在进行大量的数字运算 我注意到由于以下方法而存在一些争用 这只是一个示例 我的实际代码有点不同 synchronized boole
  • Jenkins 构建流程与工作流程(管道)插件

    我注意到 Jenkins 至少 有两个编排选项 构建流程 https wiki jenkins ci org display JENKINS Build Flow Plugin Workflow https github com jenki
  • float 变量不满足条件 (C)

    我试图让用户输入 1 00000 到 0 00001 之间的数字 而边缘不包含在浮点变量中 我可以假设用户在点后输入的数字不超过 5 个 现在 这是我写的 printf Enter required Leibniz gap Between
  • 是否可以更改代理的目标?

    我有一个实现 XMLHttpRequest 接口的类 取决于传递给的 URLopen 我可以确定是使用默认的 XMLHttpRequest 还是我的自定义实现 我的想法是使用代理来执行此操作 let xhr new XHRProxy xhr
  • 仅覆盖分区 Spark 数据集中的部分分区

    我们如何覆盖分区数据集 但只覆盖我们要更改的分区 例如 重新计算上周的日常工作 并且只覆盖上周的数据 Spark 的默认行为是覆盖整个表 即使只写入某些分区 从 Spark 2 3 0 开始 这是覆盖表时的一个选项 要覆盖它 您需要设置新的
  • “pip install --user ...”的目的是什么?

    From pip install help user Install to the Python user install directory for your platform Typically local or APPDATA Pyt
  • 测试元素是否已经有 jQuery datepicker

    我有一个包含许多输入元素的表单 有些是已附加 jQuery UI 日期选择器的日期字段 someElement mask 9 9 99 9999 datepicker showOn button buttonText Click here
  • 如何在 Jetty 9 中访问实例化的 WebSocket?

    这可能是显而易见的 但我对这种范例很陌生 我创建一个 Jetty 服务器并注册我的 websocket 类 如下所示 Server server new Server 8080 WebSocketHandler wsHandler new
  • Postgres 中的运算符 ~<~

    Originally part of this question https stackoverflow com questions 35629454 order by with diacritic in postgres but it w
  • 理解DoFactory设计模式的UML——装饰器

    我试图理解下面链接中描述装饰器模式的 UML 图 http www dofactory com Patterns PatternDecorator aspx http www dofactory com Patterns PatternDe
  • 在根文件夹下获取 javascript 时出现 403 禁止错误

    我的根文件夹下有 javascripts 文件夹 到目前为止一切正常 突然 脚本文件夹下的所有 javascript 开始出现以下错误 我今天所做的唯一更改是 在网站根目录下部署了一些文件 这些文件是asp文件 我根本没有将任何文件部署到脚
  • Laravel 5. 使用 USING 运算符

    我尝试了很长时间才找到它 我不敢相信Laravel没有这个功能 所以 我可以写 select from a join b where a id b id 或者更漂亮 select from a join b using id 第一种情况对于
  • Pandas 与带有 WHERE 子句的 JOIN 类似

    我正在 python 的 pandas 中连接两个数据框 A 和 B 目标是接收来自 B 的所有纯行 sql 模拟 在 A client id B client id 上右连接 B 其中 A client id 为 null 在 panda
  • 如何使用 runhaskell 增加堆栈大小?

    我正在编写一些一次性 Haskell 脚本来解决一些问题欧拉计划 http projecteuler net问题 我真的不想编译它们 因为我经常需要进行大量的更改 但在某些情况下 我发现堆栈空间不足 的文档runhaskell表示以下语法应
  • MySQL 5.6 中的全局查询超时

    我需要在我的应用程序中在全局级别应用查询超时 查询 SET SESSION max execution time 1MySQL 5 7 就是这样做的 我使用的是MySQL 5 6 目前无法升级 任何使用 SQL Alchemy 的解决方案也
  • jSpinner时间选择器模型编辑

    我有 jSpinner 用于时间选择 问题一 用户可以编辑小时分钟和秒分隔符 并可以写入额外的数字 例如 123 问题2 模型始终获取当前时间 我想要 00 00 00 当我在代码中编写此内容而不是 hh mm ss 时 用户无法编辑这些值
  • Hibernate 4 -> 5 迁移:NamingStrategy 更改,找不到表

    我想做的事 我正在尝试从 WildFly 8 2 0 迁移到 WildFly 10 0 0 这意味着我已经 并且想要 从 Hibernate 4 3 迁移到 Hibernate 5 0 Setup Java 8u40 Spring 4 1