java - hibernate 默认采用哪种命名策略

标签 java hibernate jpa jboss jboss6.x

在研究如何实现自定义命名策略(仅针对表名)时,我偶然发现了一个我无法解决的不一致问题。 (我在 JBoss 6.1.0.Final 和 PostgreSQL 9.1.9 上使用 hibernate-core 3.6.6.Final)

NamingStrategy 似乎有三个内置实现:

  1. 默认命名策略
  2. EJB3NamingStrategy
  3. 改进的命名策略

org.hibernate.cfg.Configuration 中的默认值似乎设置为 EJB3NamingStrategy

然而,表名似乎是根据一种策略设置的,与以上都不匹配。

例子:
类名:package.ClassName
结果表名称:classname

策略 1 和 2 简单地调用 StringHelper.unqualify( className ),它简单地删除所有包名和点,所以结果应该是 ClassName

策略 3 删除所有包名和点,然后在每个驼峰字母前加上下划线,最后转换为小写,这应该产生 class_name

(hibernate 4.1.0.Final 的源代码在这些类中似乎没有变化。)

谁能帮我澄清一下?

最佳答案

非常简单!因为我不想花时间用 hibernate-core 3.6.6.Final 创建玩具环境,所以我向您提供了如何检查完全在您的工作应用程序中使用的实例.

在您的主机上安装 visualvm。它允许为本地应用程序创建堆转储。在删除服务器上创建堆转储 - 在服务器上运行:

jmap -dump:format=b,file=heap.dump $PID

visualvm 中打开转储并运行 OQL 查询:

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")

这就是您的命名策略。您可以使用“实例”选项卡在引用层次结构中导航,以了解使用了哪些其他实际类型的 hbmjpa NamingStrategy。

不同版本的 Hibernate 有不同的声明字段和类型。如果没有 namingStrategyDelegator 字段尝试挖掘实例:

heap.objects('org.hibernate.cfg.Configuration')

如果该类不在您的 Hibernate 版本中 - 请尝试阅读文档和源代码并找到合适的类。

随着依赖 org.hibernate:hibernate-entitymanager:jar:4.3.11.Final 我有:

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")
      == org.hibernate.cfg.naming.LegacyNamingStrategyDelegator

它在内部使用:

LegacyHbmNamingStrategyDelegate
LegacyJpaNamingStrategyDelegate

取决于 JPA 注释的呈现。在任何情况下,此实例都引用 LegacyNamingStrategyDelegator(是的,循环引用!),它具有字段 namingStrategyorg.hibernate.cfg.EJB3NamingStrategy 的实例.

就这些!我花了 1 分钟在我的 wepapp 中找到默认命名策略实现,并花了 5 分钟写这篇文章((

感谢收看,祝黑客愉快!

关于java - hibernate 默认采用哪种命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124310/

相关文章:

java - hibernate 注释 : No default constructor for entity

java - 针对关系表的 Hibernate 查询

spring - 为什么在将 Spring Data JPA 与 Spring Boot 结合使用时,我的数据库自定义未得到应用?

mysql - SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException : could not extract ResultSet

java - 如何在 Hibernate 中使用 PostgreSQL XML 字段?

java - "Turn off"输出流

java - Hibernate查询多个关联

java - Postfix 电子邮件流解析

java - 如何使用 Jinq 搜索 Set

java - 在 ListView 的 ListItem 中删除和取消删除