【问题标题】:Hibernate scheme naming differs between OS休眠方案命名因操作系统而异
【发布时间】:2011-09-07 07:17:24
【问题描述】:

我面临的问题是休眠生成的模式名称(例如表名)在 Windows 和 Linux 之间不同。在 Windows 上,所有表名都是小写的,例如account,而在 Linux 下创建的表名是驼峰式的,例如Account.

在两个系统上,我使用相同版本的 MySQL 5 和以下休眠配置:

<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop key="hibernate.bytecode.provider">cglib</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop> 

这里发生了什么?基本上我可以忍受这个奇怪的问题,但有时它很烦人,我不能只将我的表从我的 windows IDE 导出到我的 linux 环境。

【问题讨论】:

  • 你是在表和列上指定名称还是让 hibernate 为你选择一个名称?我很确定会发生这种情况,因为 windows 文件系统不区分大小写,而 linux 是。这会影响 mysql,因为每个表名最终都是一个文件。例如,在 linux 中,您可以在 schema 中包含以下所有表:test、Test 和 tEst,而在 windows 中会导致错误(表已存在)。
  • 我将表的命名留给 Hibernate

标签: mysql hibernate jpa jakarta-ee


【解决方案1】:

不幸的是,这是 mysql 在区分大小写的文件系统上的工作方式(我在 Mac 上遇到了与大小写“不敏感”文件系统相同的问题)。要解决此问题,您需要自己提供表的名称。

例如

@Entity
@Table(name="user")
public class User implements Serializable {
    ...
}

表名全部小写!这样,您就可以确保该表将被 MySQL 正确命名。

要说的很清楚,问题不在于hibernate,而在于mysql如何处理表名。

【讨论】:

  • 我以前有所有这些注释,但如果你想让 Hibernate 创建所有东西,我认为放置它们是不好的设计。有没有办法提供某种“休眠命名方案”?
  • 请不要告诉 DBA 你让 hibernate 创建模式,否则他可能会有某种暴力反应:)。
【解决方案2】:

您可能希望将属性 hibernate.ejb.naming_strategy 设置为 org.hibernate.cfg.ImprovedNamingStrategy 或实现您自己的命名策略类。

【讨论】:

  • 感谢分享那个 gouki,我不知道这个功能。
【解决方案3】:

似乎很明显存在命名或大小写问题。

我把下面的改成小写,问题就解决了:

  1. 表中的列名
  2. 表名
  3. 我还更改了数据库名称,因为我使用了霰弹枪方法。
  4. .java 和 *.hbm.xml 文件中对上述内容的所有引用

我这样做是因为我刚刚开始一个项目,想使用 Hibernate 但不熟悉它,并且不在乎这些与数据相关的项目是否有如此微小的变化。

我也采用了这种方法,因为它看起来直截了当且不神秘。如果失败了,我会尝试不同的技术和解决方案。

我不必更改或添加任何不熟悉的代码或注释。我所要做的就是将上面提到的项目小写。

这是一个基本的元数据解决方案,而不是一个陌生的代码解决方案。

这很不雅,但它消除了关于案件相关问题是否导致您的情况的任何歧义。

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2016-12-14
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多