在研究如何实现自定义命名策略(仅针对表名)时,我偶然发现了一个我无法解决的不一致问题。 (我在 JBoss 6.1.0.Final 和 PostgreSQL 9.1.9 上使用 hibernate-core 3.6.6.Final)
NamingStrategy 似乎有三个内置实现:
默认命名策略EJB3NamingStrategy改进的命名策略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")
这就是您的命名策略。您可以使用“实例”选项卡在引用层次结构中导航,以了解使用了哪些其他实际类型的 hbm 或 jpa 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(是的,循环引用!),它具有字段 namingStrategy 和 org.hibernate.cfg.EJB3NamingStrategy 的实例.
就这些!我花了 1 分钟在我的 wepapp 中找到默认命名策略实现,并花了 5 分钟写这篇文章((
感谢收看,祝黑客愉快!
关于java - hibernate 默认采用哪种命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124310/
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的: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?并散列所有无济于事。
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的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
我正在尝试使用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
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht