2012-02-13 71 views
0

添加索引在現有的表我有工作,並詳細實體之間一對多的關係,兩者具有共同的父(BaseEntity)在休眠

@MappedSuperclass 
public abstract class BaseEntity { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Long id; 
@Version 
@Column(name = "version") 
private Integer version; 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "create_time") 
private Date createTime; 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "last_update_time") 
private Date lastUpdateTime; 

@PrePersist 
public void prePersist() { 
    createTime = new Date(); 
} 

@PreUpdate 
public void preUpdate() { 
    lastUpdateTime = new Date(); 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public Integer getVersion() { 
    return version; 
} 

public void setVersion(Integer version) { 
    this.version = version; 
} 

public Date getCreateTime() { 
    return createTime; 
} 

public void setCreateTime(Date createTime) { 
    this.createTime = createTime; 
} 

public Date getLastUpdateTime() { 
    return lastUpdateTime; 
} 

public void setLastUpdateTime(Date lastUpdateTime) { 
    this.lastUpdateTime = lastUpdateTime; 
} 
} 

工作

public class Job extends BaseEntity { 

    ... 
    @OneToMany(mappedBy = "job", cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    @OrderColumn 
    private List<Detail> detailList; 
    ... 
} 

詳細

@Entity 
public class Detail extends BaseEntity { 
    ... 
    @ManyToOne 
    private Job job; 
    ... 
} 

作業表有大約200K行,細節表有3M行。如果我得到某個特定作業的詳細信息,則需要2秒鐘的本地查詢。我通過運行sql語句創建了job_id列的索引。查詢響應現在約爲20毫秒。但是,該應用程序現在正在生產,並且它有數據,因此我想通過添加不運行sql語句的註釋來創建索引。爲了創建索引,我添加了@OrderColumn註釋,並在提取它時給出以下例外。順便說一下,Detail表中的job_id列是由hibernate命名的。我沒有明確給這個專欄命名。

org.hibernate.HibernateException: null index column for collection: tr.com.ttnet.beyazfatura.model.Job.detailList 
    at org.hibernate.persister.collection.AbstractCollectionPersister.readIndex(AbstractCollectionPersister.java:770) 
    at org.hibernate.collection.PersistentList.readFrom(PersistentList.java:402) 
    at org.hibernate.loader.Loader.readCollectionElement(Loader.java:1156) 
    at org.hibernate.loader.Loader.readCollectionElements(Loader.java:774) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:622) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:829) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
    at org.hibernate.loader.Loader.loadCollection(Loader.java:2166) 
    at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:627) 
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83) 
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1863) 
    at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:479) 
    at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:900) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:279) 
    at org.hibernate.loader.Loader.doList(Loader.java:2533) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) 
    at org.hibernate.loader.Loader.list(Loader.java:2271) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716) 
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) 
    at tr.com.ttnet.beyazfatura.ejb.ModelOperations.getJobs(ModelOperations.java:488) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310) 
    at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
    at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
    at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) 
    at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) 
    at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at com.bea.core.repackaged.springframework.jee.spi.MethodInvocationVisitorImpl.visit(MethodInvocationVisitorImpl.java:37) 
    at weblogic.ejb.container.injection.EnvironmentInterceptorCallbackImpl.callback(EnvironmentInterceptorCallbackImpl.java:54) 
    at com.bea.core.repackaged.springframework.jee.spi.EnvironmentInterceptor.invoke(EnvironmentInterceptor.java:50) 
    at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at com.bea.core.repackaged.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
    at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) 
    at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) 
    at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at com.bea.core.repackaged.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy250.getJobs(Unknown Source) 
    at tr.com.ttnet.beyazfatura.ejb.ModelOperations_vrg1wg_ModelOperationsLocalImpl.__WL_invoke(Unknown Source) 
    at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:39) 
    at tr.com.ttnet.beyazfatura.ejb.ModelOperations_vrg1wg_ModelOperationsLocalImpl.getJobs(Unknown Source) 
    at tr.com.ttnet.datamodel.JobLazyDataModel.load(JobLazyDataModel.java:86) 
    at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:644) 
    at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:178) 
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:103) 
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) 
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:61) 
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45) 
    at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:185) 
    at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:108) 
    at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:55) 
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655) 
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:164) 
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849) 
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:57) 
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45) 
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:51) 
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:395) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300) 
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at tr.com.ttnet.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:40) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277) 
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183) 
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:176) 
2012-02-13 14:08:41,462 WARN (LoadContexts.java:132) - fail-safe cleanup (collections) : [email protected]<rs=weblogic.jdbc. 
[email protected]> 
2012-02-13 14:08:41,463 WARN (CollectionLoadContext.java:370) - On CollectionLoadContext#cleanup, localLoadingCollectionKeys contained [1] entries 

回答

2

「不過,該應用程序是在生產現在有數據,因此我 希望通過添加註釋不運行SQL語句 創建索引」

錯誤。在生產中創建索引時使用腳本比在其他環境中使用腳本更重要。需要進行適當的影響分析和配置管理。

無論如何,我認爲你誤解了註釋的目的。 @OrderColumn提供了一個數組索引,用於控制結果集中記錄的順序,似乎對提高底層數據庫查詢的性能沒有意義。 (但是我是一個數據庫人員而不是Hibernate人員,所以我的解釋可能是錯誤的。)

至於爲什麼你得到那個具體的excle,試試看this response to a related question

+0

我將此聲明作爲解決方案「在生產中創建索引時使用腳本比在其他環境中使用腳本更重要。」謝謝。 – 2012-02-13 16:45:49