在研究如何实现自定义命名策略时(仅针对表名),我偶然发现了一个我无法解决的不一致问题。 (我在JBoss 6.1.0.Final上使用hibernate-core 3.6.6.Final和PostgreSQL 9.1.9)
NamingStrategy
似乎有三个内置实现:
DefaultNamingStrategy
EJB3NamingStrategy
ImprovedNamingStrategy
默认似乎设置为EJB3NamingStrategy
中的org.hibernate.cfg.Configuration
。
然而,表名似乎是根据策略设置的,不符合上述任何一项。
例:
班级名称:package.ClassName
结果表名称:classname
策略1和2只需调用StringHelper.unqualify( className )
即可删除所有包名和点,因此结果应为ClassName
。
策略3删除所有包名称和点,然后在每个camelcased字母之前放置一个下划线,最后转换为小写,这应该产生class_name
。
(hibernate 4.1.0.Final的源代码在这些类中似乎没有变化。)
有人可以帮我澄清一下吗?
答案 0 :(得分:3)
很简单!因为我不想花时间用visualvm
来创建玩具环境,所以我会告诉您如何检查哪个实例在您的工作应用程序中。
在您的主机上安装jmap -dump:format=b,file=heap.dump $PID
。它允许为本地应用程序创建堆转储。在删除服务器上创建堆转储 - 在服务器上运行:
visualvm
在map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")
中打开转储并运行OQL查询:
hbm
您的命名策略。您可以使用“实例”选项卡在引用层次结构中导航,以了解使用其他实际类型的jpa
或namingStrategyDelegator
NamingStrategy。
不同版本的Hibernate具有不同的声明字段和类型。如果没有heap.objects('org.hibernate.cfg.Configuration')
字段,请尝试挖掘实例:
org.hibernate:hibernate-entitymanager:jar:4.3.11.Final
如果该类不在您的Hibernate版本中 - 请尝试阅读文档和资源并找到合适的类。
依赖map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")
== org.hibernate.cfg.naming.LegacyNamingStrategyDelegator
我有:
LegacyHbmNamingStrategyDelegate
LegacyJpaNamingStrategyDelegate
它在内部使用:
LegacyNamingStrategyDelegator
取决于JPA注释的呈现。在任何情况下,此实例都引用namingStrategy
(是的,循环引用!),其字段org.hibernate.cfg.EJB3NamingStrategy
的实例为static
。
那一切!我花了1分钟在我的wepapp中找到默认的命名策略实现,用5分钟写这篇文章((
感谢观看,快乐的黑客攻击!