Hibernate默认的命名策略是什么?

8
在研究如何实现自定义命名策略(仅适用于表名)时,我遇到了一个无法解决的不一致性。(我在使用Hibernate-core 3.6.6.Final,在JBoss 6.1.0.Final上使用PostgreSQL 9.1.9)
似乎有三个内置的NamingStrategy实现:
  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy
默认策略似乎设置为EJB3NamingStrategyorg.hibernate.cfg.Configuration中。
然而,表名似乎根据一种与上述任何一种都不匹配的策略设置。
例如:
类名:package.ClassName
结果表名:classname 策略1和2只是调用StringHelper.unqualify( className ),它只是删除所有包名称和点,因此结果应该是ClassName
策略3删除所有包名称和点,然后在每个驼峰式字母前面放置下划线,最后转换为小写,这应该产生class_name
(Hibernate 4.1.0.Final的源代码似乎在这些类中没有改变。)
有人能帮我澄清一下吗?
1个回答

5
非常简单!因为我不想花时间创建一个带有 hibernate-core 3.6.6.Final 的玩具环境,所以我会给你指示如何检查哪个实例确切地在你的工作应用程序中使用

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

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

打开 visualvm 的 dump 文件并运行 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分钟找到我的web应用程序中默认的命名策略实现,又花了5分钟写这篇文章((

谢谢观看,祝愉快编程!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接