generateSelectSizeString

generateSelectSizeString

嗨,我在Struts2休眠应用程序中始终遇到此错误。下面是此错误的堆栈跟踪

    SEVERE: Could not instantiate collection persister org.hibernate.persister.collection.BasicCollectionPersister
org.hibernate.MappingException: Could not instantiate collection persister org.hibernate.persister.collection.BasicCollectionPersister
    at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:242)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:201)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:430)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)
    at projectBroomKetuActionDataItrfc.dto.HibernateUtility.getSessionFactory(HibernateUtility.java:19)
    at projectBroomKetuActionDataItrfc.dto.DatabaseInteractionInterface.checkDataDuplication(DatabaseInteractionInterface.java:60)
    at projectBroomKetuAction.SignUpActionClass.validate(SignUpActionClass.java:462)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doBeforeInvocation(ValidationInterceptor.java:251)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:76)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:125)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:253)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:564)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    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:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
    at org.hibernate.persister.collection.AbstractCollectionPersister.generateSelectSizeString(AbstractCollectionPersister.java:1020)
    at org.hibernate.persister.collection.AbstractCollectionPersister.<init>(AbstractCollectionPersister.java:528)
    at org.hibernate.persister.collection.BasicCollectionPersister.<init>(BasicCollectionPersister.java:77)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:231)
    ... 66 more


以下是hibernat.cfg.xml

<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/b#%^^DB</property>


        <property name="connection.username">****</property>

        <property name="connection.password">******</property>



       <!-- JDBC connection pool (use the built-in) -->
        <!--
        <property name="connection.pool_size">10</property>          -->        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>         <property name="hibernate.c3p0.min_size">1</property>
        <property name="hibernate.c3p0.max_size">15</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">30</property>

                <!--  Connection testing settings -->

        <property name="hibernate.c3p0.validate">false</property>
        <property name="hibernate.c3p0.automaticTestTable">conTestTable</property>

        <!--
        <property name="hibernate.c3p0.timeout">600</property>
        <property name="hibernate.c3p0.maxIdleTimeExcessConnections">20</property>      -->
        <!--  Connection testing settings -->
        <!--
        <property name="hibernate.c3p0.validate">false</property>
        <property name="hibernate.c3p0.idle_test_period">30</property>
        <property name="hibernate.c3p0.automaticTestTable">conTestTable</property>
        -->
        <!-- SQL dialect -->
        <property name="dialect">projectBroomKetuDataClass.dto.ImprovedMySQLDialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

         <!-- Drop and re-create the database schema on startup -->         <property name="hbm2ddl.auto">update</property>         <mapping class="projectBroomKetuDataClass.dto.HouseHoldDetails"/>       <mapping class="projectBroomKetuDataClass.dto.MaidsDetails"/>       <mapping class="projectBroomKetuDataClass.dto.HouseHoldServiceReqMap"/>         <mapping class="projectBroomKetuDataClass.dto.MaidWeekTimeMap"/>        <mapping class="projectBroomKetuDataClass.dto.VerificationToken"/>      <mapping class="projectBroomKetuDataClass.dto.Services"/>       <mapping class="projectBroomKetuDataClass.dto.ServicesOffered"/>
                <mapping class="staff.CoordinatorDataClass.dto.CoordinatorDetails"/>        <mapping class="resource.dataClasses.dto.HouseKeeperDetails"/>      <mapping class="resource.dataClasses.dto.ElederCareTakerDetails"/>      <mapping class="resource.dataClasses.dto.DriverDetails"/>       <mapping class="resource.dataClasses.dto.CookDetails"/>         <mapping class="resource.dataClasses.dto.BabySitterDetails"/>
                <mapping class="services.dataClass.dto.BabySittingService"/>        <mapping class="services.dataClass.dto.CookingService"/>        <mapping class="services.dataClass.dto.DriverService"/>         <mapping class="services.dataClass.dto.ElderlyCareService"/>        <mapping class="services.dataClass.dto.HouseKeepingService"/>
    </session-factory>

</hibernate-configuration>


下面是我的HibernateUtil类的代码片段

public static final SessionFactory getSessionFactory() {
    if(null == sessionFactory)
    {
        //try{
            Configuration configuration = new Configuration();
            configuration.configure();
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
               configuration.getProperties()).build();

            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        //}
    //  catch(HibernateException ex){
        //  System.err.println("Initial SessionFactory creation failed." + ex);
         //  return null;
      // }
     }
            return sessionFactory;
    }
}


请任何人可以帮助我。我试图找出为什么我得到一个


  java.lang.ArrayIndexOutOfBoundsException:0处
  org.hibernate.persister.collection.AbstractCollectionPersister.generateSelectSizeString


但是什么也猜不到。

编辑:

我再次查看了异常的来源,这是此代码段。

protected String generateSelectSizeString(boolean isIntegerIndexed) {
        String selectValue = isIntegerIndexed ?
                "max(" + getIndexColumnNames()[0] + ") + 1" : // lists, arrays
                "count(" + getElementColumnNames()[0] + ")"; // sets, maps, bags
        return new SimpleSelect( dialect )
                .setTableName( getTableName() )
                .addCondition( getKeyColumnNames(), "=?" )
                .addColumn( selectValue )
                .toStatementString();
    }


现在从调用函数generateSelectSizeString(boolean isIntegerIndexed)的角度来看,这是

 sqlSelectSizeString = generateSelectSizeString( collection.isIndexed() && !collection.isMap() );


这里isIndexed和isMap都总是返回false。回到方法定义

受保护的字符串generateSelectSizeString(boolean isIntegerIndexed)

isIntegerIndexed =否

因此,此行发生数组超出范围的异常

String selectValue = "count(" + getElementColumnNames()[0] + ")";


再次
 getElementColumnNames()返回受保护的最终String数组elementColumnNames。
这是从的构造函数内部分配的内存
org.hibernate.persister.collection.AbstractCollectionPersister

在这条线

int elementSpan = collection.getElement().getColumnSpan();
elementColumnNames = new String[elementSpan];


我看不到getColumnSpan()的工作原理,但是它肯定返回0,这就是为什么当我们访问elementColumnNames [0]时,会得到数组Out of bound异常。
有谁知道getColumnSpan()的工作方式。我再次检查了我的代码,我认为没有任何未解决的问题

最佳答案

确定解决了我没有在可嵌入类之一中写入任何字段,因为该字段的列跨度为0。这导致数组索引超出范围异常。
以前是这样的

import javax.persistence.Embeddable;

@Embeddable
public class HouseKeeperSuggested {


}


然后我添加了一个字段

import javax.persistence.Embeddable;

@Embeddable
public class HouseKeeperSuggested {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


问题解决了

10-05 23:17