2012-08-01 42 views
1

尝试扩展具有县的Unit时发生错误,特别是在重新启动应用程序以初始化ORM时。 [注:我试图单表继承]扩展持久性CFC时出现NullPointerException

ORM是管理我的DB模式:this.ormsettings.dbcreate=dropcreate

当我从车型目录中删除County.cfc,ORM初始化和应用程序正常启动。当我将County.cfc放回模型目录时,错误再次发生。

的ColdFusion版本10,282462 MSSQL IIS

单位:

<cfcomponent persistent="true" entityname="Unit" table="Units" discriminatorColumn="type"> 
    <cfproperty name="id" fieldtype="id" column="unit_id" generator="identity"> 
    <cfproperty name="name" default="" type="string" length="50"> 
    <cfproperty name="description" type="string" sqltype="varchar(max)" default=""> 
    <cfproperty name="active" type="boolean" default="true"> 
</cfcomponent> 

县:

<cfcomponent persistent="true" entityname="County" table="Units" extends="Unit" discriminatorValue="county"> 
    <cfproperty name="officeAddress" type="string"> 
</cfcomponent> 

堆栈跟踪:

java.lang.NullPointerException at 
org.hibernate.mapping.PersistentClass.createPrimaryKey(PersistentClass.java:322) at 
org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:405) at 
org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:321) at 
org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:172) at 
org.hibernate.cfg.Configuration.add(Configuration.java:771) at 
org.hibernate.cfg.Configuration.addDocument(Configuration.java:586) at 
coldfusion.orm.hibernate.HibernateConfiguration.buildConfiguration(HibernateConfiguration.java:611) at 
coldfusion.orm.hibernate.HibernateConfiguration.initHibernateConfiguration(HibernateConfiguration.java:208) at 
coldfusion.orm.hibernate.HibernateConfiguration.<init>(HibernateConfiguration.java:181) at 
coldfusion.orm.hibernate.ConfigurationManager.initConfiguration(ConfigurationManager.java:67) at 
coldfusion.orm.hibernate.HibernateProvider.InitializeORMForApplication(HibernateProvider.java:185) at 
coldfusion.orm.hibernate.HibernateProvider.onPageRequestStart(HibernateProvider.java:151) at 
coldfusion.filter.ApplicationFilter.firePageRequestStart(ApplicationFilter.java:599) at 
coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:407) at 
coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) at 
coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) at 
coldfusion.filter.PathFilter.invoke(PathFilter.java:112) at 
coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94) at 
coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79) at 
coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) at 
coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at 
coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) at 
coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) at 
coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) at 
coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62) at 
coldfusion.CfmServlet.service(CfmServlet.java:204) at 
coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at 
coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:414) at 
org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:203) at 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) at 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at 
java.lang.Thread.run(Thread.java:662) 

奇怪的是,我已经在做与其他实体(DiscussionPost扩展后),类似的事情:

帖子:

<cfcomponent persistent="true" entityname="Post" table="Posts" discriminatorColumn="type"> 
    <cfproperty name="id" fieldtype="id" column="post_id" generator="identity"> 
    <cfproperty name="promotions" fieldtype="one-to-many" cfc="PostPromotion" fkcolumn="post_id" singularname="promotion"> 
    <cfproperty name="comments" fieldtype="one-to-many" cfc="PostComment" fkcolumn="post_id" singularname="comment">  
    <cfproperty name="user" fieldtype="many-to-one" cfc="User" fkcolumn="user_id"> 
    <cfproperty name="text" type="string" sqltype="varchar(1000)"> 
    <cfproperty name="timestamp" type="date" ormtype="timestamp"> 
</cfcomponent> 

DiscussionPost:

<cfcomponent persistent="true" entityname="DiscussionPost" table="Posts" extends="Post" discriminatorValue="discussionpost"> 
    <cfproperty name="discussion" fieldtype="many-to-one" cfc="Discussion" fkcolumn="discussion_id"> 
    <cfproperty name="title" type="string" sqltype="varchar(200)"> 

</cfcomponent> 

我缺少什么?

+1

PersistentClass中createPrimaryKey()的第322行在尝试将列添加到主键时抛出NPE。该键不存在,或者它的getColumnIterator()返回null。 – 2012-08-15 01:58:15

+1

对歧义的使用我不太了解,但是关于扩展ORM模型有一点:默认情况下属性不会被继承。难道'县'模型中不存在'id'属性,这导致Mike描述的问题? – Sergii 2012-08-16 09:21:27

+0

@Sergii,我想这是可能的;然而,在Post/DiscussionPost的例子中,DiscussionPost并没有声明'id'字段,但它确实继承了它。我通过创建一个新的DiscussionPost来确认这一点,保存它,然后检查DB中的Posts帖子:新的DiscussionPost在那里!单表继承的两种情况有所不同,但我看不到它是什么。 – 2012-08-16 18:37:22

回答

0

好的。事实证明,这个答案非常简单。通过执行全局搜索并替换我的代码库,用'container'替换'unit',我能够在应用程序中获得单一表继承以正常工作。认真。这就是我所做的一切,并发挥作用。 '单位'显然不是CF中的保留字,因为实体Unit独立工作,但它在一些内部过程中一定会导致问题(也许在@MikeCauser建议的getColumnIterator()中)。

感谢大家的建议。

编辑:这原来是一个附带的修复程序,而不是针对问题的根源,无论可能是什么修复。真正的解决方案仍有待发现。

编辑2:我相信现在手头上的问题不得不做在ColdFusion/Hibernate的,仅仅需要由ColdFusion服务的重新启动被刷新内部。

是的,在我的桌子上撞了两个星期后,我重新启动了ColdFusion应用程序服务,并解决了我的问题。从那时起,我已经扩展了容器组件3次。一切都显得很好,我已经继续我的申请。

+0

尽管做了一个全局搜索并替换DID修复了一段时间的应用程序,但我仍然从县收到一个NPE,没有任何明确的原因。一个测试,我创建了第二个ORM应用程序,其中包含基本实体“Unit”和4个扩展:'County','Program','UserStash','FileGroup'.应用程序按预期运行,NPE绝对为零。基本组件的名称并不重要,仍然在解决方案..... – 2012-08-20 16:40:40

+0

得到这个。我将我的源复制到一个新的目录并设置一个新的数据源,然后运行我的应用程序。 d与零NPEs。这可能与Hibernate的内部(隐藏)配置没有正确更新有关吗? – 2012-08-21 00:51:22

+0

我很尴尬,但很放心。 – 2012-08-23 02:58:56

1

看起来你可能会丢失在County.cfc

为officeAddress财产SQLTYPE属性这是否解决问题了吗?

+1

不幸的是,谢谢你的回答, – 2012-08-13 18:11:18

1

看起来这可能是你所遇到的问题:https://hibernate.onjira.com/browse/HBX-54

我认为解决方法是一个id属性添加到County.cfc:

<cfproperty name="id" fieldtype="id" column="county_id" generator="identity"> 

上面的代码假定您的ID列被命名为“county_id”。这能解决你的问题吗?

+0

不幸的是,这个想法是'County'会从'Unit'继承'id'字段,这正是Post/DiscussionPost。另外,据我所知,单个表不能有两个主键 – 2012-08-16 18:38:37