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:
DefaultNamingStrategyEJB3NamingStrategyImprovedNamingStrategy默认似乎被设置为EJB3NamingStrategy在org.hibernate.cfg.Configuration.
但是,表名似乎是根据策略设置的,不符合上述任何一项.
示例:
类名称:package.ClassName
结果表名称:classname
策略1和2简单地调用StringHelper.unqualify( className )哪个简单地删除所有包名称和点,因此结果应该是ClassName.
策略3删除所有包名称和点,然后在每个camelcased字母之前放置一个下划线,最后转换为小写,这应该产生class_name.
(hibernate 4.1.0.Final的源代码似乎在这些类中没有变化.)
任何人都可以帮我澄清一下吗?
好简单!因为我不想花时间创建玩具环境,所以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 分钟写这篇文章 ((
感谢观看,祝黑客快乐!
| 归档时间: |
|
| 查看次数: |
2628 次 |
| 最近记录: |