通过 Hibernate 在 Linux 中区分 MySQL 大小写

Posted

技术标签:

【中文标题】通过 Hibernate 在 Linux 中区分 MySQL 大小写【英文标题】:MySQL Case Sensitive in Linux through Hibernate 【发布时间】:2015-04-07 01:01:23 【问题描述】:

我将 Eclipse 中的开发环境从 Windows 移至 Debian。当我这样做时,我注意到当 Hibernate 在初始化期间进行数据模型检查时,由于区分大小写的问题,在 mysql 中没有找到(只是一些)表名。其中两个表仍在通过“Table_name”而不是“table_name”搜索。当它发生时,Hibernate 创建新表“Table_name”而忽略现有的“table_name”。我读到这是由于区分大小写的操作系统中的 MySQL 功能

我在每个模型类中添加了@Table(name="table_name") 语句,以避免 MySQL/Hibernate 将表名大写,并且我查看了 DAO 类中的所有 HQL 查询,将所有表引用都设为小写,但我已经两种尝试都没有成功。

为了解决此问题,我缺少什么配置?谢谢。

【问题讨论】:

好吧,亚历克斯,发生了什么事?你让它工作了吗? 【参考方案1】:

这是 MySQL 的一个众所周知的问题,因为它会为每个表创建一个实际的磁盘文件。

Hibernate 试图通过内部小写所有表名来专门为 MySQL 解决这个问题,但显然这不是一个防弹的解决方案。

据我所知,除了确保在任何地方都使用一致的大写字母之外,您无能为力。换句话说,没有什么神奇的配置选项可以为您做到这一点。

如果你使用“hibernate.hbm2ddl.auto”属性让hibernate创建你的数据库模式,那么你应该没问题,但如果你在预先存在的数据库上运行hibernate,那么这还不够,因为你有还要确保该表是作为“table_name”创建的,并且任何外键引用也将其作为“table_name”引用。 (因此,在任何地方都使用@Table(name="table_name") 是不够的。)

在任何一种情况下,您的数据库都是在 windows 下创建的,所以即使您使用 hibernate 创建它,它仍然可能是使用您在 windows 下使用的任何有趣的大写方案创建的,这意味着您可能想丢弃您的数据库并重新创建它。

【讨论】:

感谢您的回复。事实上,我没有照顾过外键。也许我要转储所有数据并重新创建数据库。在另一个问题上,*** 上的 sb 建议我更改为 InteliJ。我什至已经安装了它,但是我的日程安排迟到了,而且我没有足够的时间来完成另一个学习曲线。 Linux 实际上使 Eclipse(很多)更快,我不知道为什么。在 Windows 中,Eclipse 性能在操作系统之后变得很糟糕。重新安装。也许在我的下一个项目中,我会转向 InteliJ。谢谢你的回答。 当然,很高兴能为您提供帮助。当您有明确的答案时,请发布您的发现,以造福后代程序员 有必要注意一个重要的问题,这对“未来几代”程序员来说是有价值的:在我的项目中,我们称之为项目A,有另一个项目的引用,我们称之为项目B、通过Maven。当我在项目 B 中进行更改时,我忘记通过 Maven Install 更新 .jar 文件,然后更新项目 A 引用。这样,在项目 A 构建期间,存储在过时 .jar 中的旧表名是问题的根源。

以上是关于通过 Hibernate 在 Linux 中区分 MySQL 大小写的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中区分 ESTALE 和 ENOENT 的最佳方法

RestKit:在 didLoadResponse 中区分多个请求:

在 Java 的 JTextArea 中区分拖动和选择

如何在airplay中区分apple tv和其他设备?

C++核心准则T.23:通过增加新的使用模式,从更加普遍的场景中区分更精炼的概念

perl 脚本来搜索 java 源代码中区分大小写的文件名