hibernate哪个命名策略是默认的

wea*_*ink 8 java jboss hibernate jpa jboss6.x

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

似乎有三种内置实现NamingStrategy:

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy

默认似乎被设置为EJB3NamingStrategy在org.hibernate.cfg.Configuration.

但是,表名似乎是根据策略设置的,不符合上述任何一项.

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

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

策略3删除所有包名称和点,然后在每个camelcased字母之前放置一个下划线,最后转换为小写,这应该产生class_name.

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

任何人都可以帮我澄清一下吗?

gav*_*koa 5

好简单!因为我不想花时间创建玩具环境,所以hibernate-core 3.6.6.Final我会指导您如何检查您的工作应用程序中到底使用了哪个实例。

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

jmap -dump:format=b,file=heap.dump $PID
Run Code Online (Sandbox Code Playgroud)

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

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")
Run Code Online (Sandbox Code Playgroud)

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

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

heap.objects('org.hibernate.cfg.Configuration')
Run Code Online (Sandbox Code Playgroud)

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

有了依赖性,org.hibernate:hibernate-entitymanager:jar:4.3.11.Final我有:

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")
      == org.hibernate.cfg.naming.LegacyNamingStrategyDelegator
Run Code Online (Sandbox Code Playgroud)

它在内部使用:

LegacyHbmNamingStrategyDelegate
LegacyJpaNamingStrategyDelegate
Run Code Online (Sandbox Code Playgroud)

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

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

感谢观看,祝黑客快乐!