hibernate哪个命名策略是默认的

时间:2013-08-08 10:59:10

标签: java hibernate jpa jboss jboss6.x

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

NamingStrategy似乎有三个内置实现:

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy
  4. 默认似乎设置为EJB3NamingStrategy中的org.hibernate.cfg.Configuration

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

    例:
    班级名称:package.ClassName
    结果表名称:classname

    策略1和2只需调用StringHelper.unqualify( className )即可删除所有包名和点,因此结果应为ClassName

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

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

    有人可以帮我澄清一下吗?

1 个答案:

答案 0 :(得分:3)

很简单!因为我不想花时间用visualvm来创建玩具环境,所以我会告诉您如何检查哪个实例在您的工作应用程序中

在您的主机上安装jmap -dump:format=b,file=heap.dump $PID 。它允许为本地应用程序创建堆转储。在删除服务器上创建堆转储 - 在服务器上运行:

visualvm

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator") 中打开转储并运行OQL查询:

hbm

您的命名策略。您可以使用“实例”选项卡在引用层次结构中导航,以了解使用其他实际类型的jpanamingStrategyDelegator 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分钟写这篇文章((

感谢观看,快乐的黑客攻击!