草庐IT

java - hibernate 默认采用哪种命名策略

coder 2024-03-13 原文

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

NamingStrategy 似乎有三个内置实现:

  1. 默认命名策略
  2. EJB3NamingStrategy
  3. 改进的命名策略

org.hibernate.cfg.Configuration 中的默认值似乎设置为 EJB3NamingStrategy

然而,表名似乎是根据一种策略设置的,与以上都不匹配。

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

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

策略 3 删除所有包名和点,然后在每个驼峰字母前加上下划线,最后转换为小写,这应该产生 class_name

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

谁能帮我澄清一下?

最佳答案

非常简单!因为我不想花时间用 hibernate-core 3.6.6.Final 创建玩具环境,所以我向您提供了如何检查完全在您的工作应用程序中使用的实例.

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

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

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

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")

这就是您的命名策略。您可以使用“实例”选项卡在引用层次结构中导航,以了解使用了哪些其他实际类型的 hbmjpa 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(是的,循环引用!),它具有字段 namingStrategyorg.hibernate.cfg.EJB3NamingStrategy 的实例.

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

感谢收看,祝黑客愉快!

关于java - hibernate 默认采用哪种命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124310/

有关java - hibernate 默认采用哪种命名策略的更多相关文章

  1. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  2. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  5. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  6. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  7. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐