在研究如何实现自定义命名策略(仅针对表名)时,我偶然发现了一个我无法解决的不一致问题。 (我在 JBoss 6.1.0.Final 和 PostgreSQL 9.1.9 上使用 hibernate-core 3.6.6.Final)
NamingStrategy
似乎有三个内置实现:
默认命名策略
EJB3NamingStrategy
改进的命名策略
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")
这就是您的命名策略。您可以使用“实例”选项卡在引用层次结构中导航,以了解使用了哪些其他实际类型的 hbm
或 jpa
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
(是的,循环引用!),它具有字段 namingStrategy
和 org.hibernate.cfg.EJB3NamingStrategy
的实例.
就这些!我花了 1 分钟在我的 wepapp 中找到默认命名策略实现,并花了 5 分钟写这篇文章((
感谢收看,祝黑客愉快!
关于java - hibernate 默认采用哪种命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124310/