使用NHibernate接收索引超出范围

时间:2009-12-14 17:16:57

标签: nhibernate nhibernate-mapping

我希望有人可以帮我解决这个问题。我一直在绞尽脑汁 我的大脑和我的项目很快到期。提前谢谢。

插入新内容时,我收到的索引超出范围异常 记录。在无休止地搜索信息后,有人建议 我映射中的列值数与我的列数不匹配 持久的阶级。然而,我计算并重新计算,他们似乎 比赛。正如您在下面的代码中所看到的,我正在使用 NHibernate.Mapping.Attributes来做我的映射。也许我在做 那里出了点问题。

我终于下载了NHibernate源码并通过我的调试 问题。下面是NHibernate正在尝试的insert语句 建立:

{INSERT INTO WTSLIB33T.PRODDATA(PSTAT,PCONO,PDVNO,PWKTY,PCRTY, PTSID,PCNNO,PDTTK,PJBNO,PSJNO,PTKNO,PCWNO,PWKAR,PWKDC,PWKCD, PCNWO,PWDNO,PDESC,PDCCD,PHRS,PUNIT,PSEQ,PCUST)价值观 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}

如您所见,参数数量与字段数相匹配 在列表中。我还将这个生成的插入与我的课程相匹配 而我发现PSEQ和PCUST列是乱序的 与我的持久课程。然后,通过Dehydrate进行调试 功能我发现了两个可能的问题。首先是我注意到了 对NullSafeSet函数的调用将参数0设置为我的PSEQ 字段应设置为但插入语句中的参数0 PSTAT。

我注意到的第二个问题是最后一次调用“index + = ArrayHelper.CountTrue(includeColumns [i]);“在Dehydrate函数中 将索引变量保留为23,这是正确的;然而,下一个 调用“IdentifierType.NullSafeSet(statement,id,index, session);“,它检查行id,在索引23中传递 会超出范围。基于零的该值应为22 阵列。


protected int Dehydrate(object id, object[] fields, object rowId, bool[] includeProperty, bool[][] includeColumns, int table, IDbCommand statement, ISessionImplementor session, int index)
            {
                    if (log.IsDebugEnabled)
                    {
log.Debug("Dehydrating entity: " + MessageHelper.InfoString(this, id, Factory));
                }
// there's a pretty strong coupling between the order of the SQL parameter
// construction and the actual order of the parameter collection.

for (int i = 0; i < entityMetamodel.PropertySpan; i++)
{
    if (includeProperty[i] && IsPropertyOfTable(i, table))
{
    PropertyTypes[i].NullSafeSet(statement, fields[i], index, includeColumns[i], session);
    index += ArrayHelper.CountTrue(includeColumns[i]); 
}
if (rowId != null)
{
    // TODO H3.2 : support to set the rowId
    // TransactionManager.manager.SetObject(ps, index, rowId);
    // index += 1;
    throw new NotImplementedException("support to set the rowId");
}
else if (id != null)
{
    IdentifierType.NullSafeSet(statement, id, index, session);
    index += IdentifierColumnSpan;
}
return index;

}

MY PERSISTENT CLASS:

[NHibernate.Mapping.Attributes.Class(0,Schema = WTSLIB33T,Table = “PRODDATA”,NameType = typeof(ProddataDAO),         懒惰=真)]     public class ProddataDAO:Object //:INotifyPropertyChanged     {         公共ProddataDAO()         {         }

    public ProddataDAO(string PSTAT, decimal PCONO, decimal PDVNO, decimal PSEQ, string PWKTY, string PCRTY,
        decimal PTSID, decimal PCUST, decimal PCNNO, decimal PDTTK, string PJBNO, string PSJNO, decimal PTKNO,
        string PCWNO, string PWKAR, string PWKDC, string PWKCD, string PCNWO, decimal PWDNO, string PDESC, 
        decimal PDCCD, decimal PHRS, decimal PUNIT)
    {
        _PSTAT = PSTAT;
        _PCONO = PCONO;
        _PDVNO = PDVNO;
        _PSEQ = PSEQ;
        _PWKTY = PWKTY;
        _PCRTY = PCRTY;
        _PTSID = PTSID;
        _PCUST = PCUST;
        _PCNNO = PCNNO;
        _PDTTK = PDTTK;
        _PJBNO = PJBNO;
        _PSJNO = PSJNO;
        _PTKNO = PTKNO;
        _PCWNO = PCWNO;
        _PWKAR = PWKAR;
        _PWKDC = PWKDC;
        _PWKCD = PWKCD;
        _PCNWO = PCNWO;
        _PWDNO = PWDNO;
        _PDESC = PDESC;
        _PDCCD = PDCCD;
        _PHRS = PHRS;
        _PUNIT = PUNIT;
    }

    //public event PropertyChangedEventHandler PropertyChanged;

    private decimal _PSEQ;
    //[NHibernate.Mapping.Attributes.Id(0, Name="PSEQ", Column="PSEQ", Type="Decimal")]
    [NHibernate.Mapping.Attributes.CompositeId(1, UnsavedValue=NHibernate.Mapping.Attributes.UnsavedValueType.Undefined)]
    [NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PSEQ", Column = "PSEQ", Type="Decimal")]
    [NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PCUST", Column = "PCUST")]
    //[NHibernate.Mapping.Attributes.Generator(3, Class="none")]
    [NHibernate.Mapping.Attributes.Property(4, Name="PSEQ", Column="PSEQ")]
    public virtual decimal PSEQ
    {
        get
        {
            return _PSEQ;
        }
        set
        {
            if (value != this._PSEQ)
            {
                _PSEQ = value;
                //OnPropertyChanged("PSEQ");
            }
        }
    }

    private decimal _PCUST;

    //[NHibernate.Mapping.Attributes.Id(0, Column = "PCUST", Type = "Decimal")]
    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PCUST
    {
        get
        {
            return _PCUST;
        }
        set
        {
            if (value != this._PCUST)
            {
                _PCUST = value;
                //OnPropertyChanged("PCUST");
            }
        }
    }

    private string _PSTAT;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PSTAT
    {
        get
        {
            return _PSTAT;
        }
        set
        {
            if (value != this._PSTAT)
            {
                this._PSTAT = value;
                //OnPropertyChanged("PSTAT");
            }
        }
    }

    private decimal _PCONO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PCONO
    {
        get
        {
            return _PCONO;
        }
        set
        {
            if (value != this._PCONO)
            {
                _PCONO = value;
                //OnPropertyChanged("PCONO");
            }
        }
    }

    private decimal _PDVNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PDVNO
    {
        get
        {
            return _PDVNO;
        }
        set
        {
            if (value != this._PDVNO)
            {
                _PDVNO = value;
                //OnPropertyChanged("PDVNO");
            }
        }
    }

    private string _PWKTY;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKTY
    {
        get
        {
            return _PWKTY;
        }
        set
        {
            if (value != this._PWKTY)
            {
                _PWKTY = value;
                //OnPropertyChanged("PWKTY");
            }
        }
    }

    private string _PCRTY;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PCRTY
    {
        get
        {
            return _PCRTY;
        }
        set
        {
            if (value != this._PCRTY)
            {
                _PCRTY = value;
                //OnPropertyChanged("PCRTY");
            }
        }
    }

    private decimal _PTSID;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PTSID
    {
        get
        {
            return _PTSID;
        }
        set
        {
            if (value != this._PTSID)
            {
                _PTSID = value;
                //OnPropertyChanged("PTSID");
            }
        }
    }

    private decimal _PCNNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PCNNO
    {
        get
        {
            return _PCNNO;
        }
        set
        {
            if (value != this._PCNNO)
            {
                _PCNNO = value;
                //OnPropertyChanged("PCNNO");
            }
        }
    }

    private decimal _PDTTK;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PDTTK
    {
        get
        {
            return _PDTTK;
        }
        set
        {
            if (value != this._PDTTK)
            {
            _PDTTK = value;
            //OnPropertyChanged("PDTTK");
            }
        }
    }

    private string _PJBNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PJBNO
    {
        get
        {
            return _PJBNO;
        }
        set
        {
            if (value != this._PJBNO)
            {
            _PJBNO = value;
            //OnPropertyChanged("PJBNO");
            }
        }
    }

    private string _PSJNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PSJNO
    {
        get
        {
            return _PSJNO;
        }
        set
        {
            if (value != this._PSJNO)
            {
            _PSJNO = value;
            //OnPropertyChanged("PSJNO");
            }
        }
    }

    private decimal _PTKNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PTKNO
    {
        get
        {
            return _PTKNO;
        }
        set
        {
            if (value != this._PTKNO)
            {
            _PTKNO = value;
            //OnPropertyChanged("PTKNO");
            }
        }
    }

    private string _PCWNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PCWNO
    {
        get
        {
            return _PCWNO;
        }
        set
        {
            if (value != this._PCWNO)
            {
            _PCWNO = value;
            //OnPropertyChanged("PCWNO");
            }
        }
    }

    private string _PWKAR;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKAR
    {
        get
        {
            return _PWKAR;
        }
        set
        {
            if (value != this._PWKAR)
            {
            _PWKAR = value;
            //OnPropertyChanged("PWKAR");
            }
        }
    }

    private string _PWKDC;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKDC
    {
        get
        {
            return _PWKDC;
        }
        set
        {
            if (value != this._PWKDC)
            {
            _PWKDC = value;
            //OnPropertyChanged("PWKDC");
            }
        }
    }

    private string _PWKCD;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKCD
    {
        get
        {
            return _PWKCD;
        }
        set
        {
            if (value != this._PWKCD)
            {
            _PWKCD = value;
            //OnPropertyChanged("PWKCD");
            }
        }
    }

    private string _PCNWO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PCNWO
    {
        get
        {
            return _PCNWO;
        }
        set
        {
            if (value != this._PCNWO)
            {
            _PCNWO = value;
            //OnPropertyChanged("PCNWO");
            }
        }
    }

    private decimal _PWDNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PWDNO
    {
        get
        {
            return _PWDNO;
        }
        set
        {
            if (value != this._PWDNO)
            {
            _PWDNO = value;
            //OnPropertyChanged("PWDNO");
            }
        }
    }

    private string _PDESC;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PDESC
    {
        get
        {
            return _PDESC;
        }
        set
        {
            if (value != this._PDESC)
            {
            _PDESC = value;
            //OnPropertyChanged("PDESC");
            }
        }
    }

    private decimal _PDCCD;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PDCCD
    {
        get
        {
            return _PDCCD;
        }
        set
        {
            if (value != this._PDCCD)
            {
            _PDCCD = value;
            //OnPropertyChanged("PDCCD");
            }
        }
    }

    private decimal _PHRS;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PHRS
    {
        get
        {
            return _PHRS;
        }
        set
        {
            if (value != this._PHRS)
            {
                _PHRS = value;
                //OnPropertyChanged("PHRS");
            }
        }
    }

    private decimal _PUNIT;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PUNIT
    {
        get
        {
            return _PUNIT;
        }
        set
        {
            if (value != this._PUNIT)
            {
                _PUNIT = value;
                //OnPropertyChanged("PUNIT");
            }
        }
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        ProddataDAO p = obj as ProddataDAO;

        if (this.PCONO == p.PCONO && this.PDVNO == p.PDVNO && this.PCUST == p.PCUST && this.PSEQ == p.PSEQ)
            return true;
        else
            return false;
    }

    public override int GetHashCode()
    {
        int hash = 1122;

        hash += (null == this.PCONO ? 0 : this.PCONO.GetHashCode());
        hash += (null == this.PDVNO ? 0 : this.PDVNO.GetHashCode());
        hash += (null == this.PCUST ? 0 : this.PCUST.GetHashCode());
        hash += (null == this.PSEQ ? 0 : this.PSEQ.GetHashCode());

        return hash;
    } 

2 个答案:

答案 0 :(得分:7)

此问题的一个可能原因是您已将两个属性映射到同一列。例如,您已将外键关系映射为关系和属性字段,或者您还有一个描述为字段的描述符。

查看主键映射,我看到它被映射了两次:

[NHibernate.Mapping.Attributes.CompositeId(1, UnsavedValue=NHibernate.Mapping.Attributes.UnsavedValueType.Undefined)]
[NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PSEQ", Column = "PSEQ", Type="Decimal")]
[NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PCUST", Column = "PCUST")]
//[NHibernate.Mapping.Attributes.Generator(3, Class="none")]
[NHibernate.Mapping.Attributes.Property(4, Name="PSEQ", Column="PSEQ")]

您确定这是使用NHiberante属性映射复合键的方法吗?我自己没有用过它。但我的猜测是,正是这导致NHibernate认为你已经将列PSEQ映射了两次。

我认为您应该只使用KeyProperty并跳过属性属性以获取属于主键的属性。 尝试在类的顶部添加它(不要装饰属性声明)

[CompositeId(1,UnsavedValue=UnsavedValueType.Undefined)]
[KeyProperty(2, Name="PSEQ", Column="PSEQ")] 
[KeyProperty(4, Name="PCUST", Column="PCUST")] 

找到这个借出的论坛帖子:https://forum.hibernate.org/viewtopic.php?f=25&t=964631&start=0

答案 1 :(得分:2)

我在使用XML映射时有类似的情况,我们最初在.hbm.xml中包含了“父ID”列,然后当我们通过多对一标签添加后向引用时收到索引超出范围异常。删除原始声明是关键。

<class name="IncomeDetail" table="INCOMEDETAILS" mutable="true" lazy="false">

    <id name="IncomeDetailID" column="INCOME_DETAIL_ID">
        <generator class="native" />
    </id>

    <property name='ParticipantID' column='PARTICIPANT_ID' type='Int32'/>
    <property name='IncomeGroupCD' column='INCOME_GROUP_CD' type='String'/>
    <property name='IncomeTypeID' column='INCOME_TYPE_ID' type='Int32'/>
    <!--<property name='EmploymentID' column='EMPLOYMENT_ID' type='Int32'/>-->
    <property name='IncomeFrequencyCD' column='INCOME_FREQUENCY_CD' type='String'/>
    <property name='CapturedDetGrossIncomeAmt' column='CAPTURED_DET_GROSS_INCOME_AMT' type='Decimal'/>
    <property name='CapturedDetNetIncomeAmt' column='CAPTURED_DET_NET_INCOME_AMT' type='Decimal'/>
    <property name='VerifiedDetGrossIncomeAmt' column='VERIFIED_DET_GROSS_INCOME_AMT' type='Decimal'/>
    <property name='VerifiedDetNetIncomeAmt' column='VERIFIED_DET_NET_INCOME_AMT' type='Decimal'/>
    <property name='IncomeDesc' column='INCOME_DESC' type='String'/>
    <property name='CapturedDT' column='CAPTURED_DT' type='DateTime' not-null='true'/>
    <property name='CapturedBy' column='CAPTURED_BY' type='String' not-null='true'/>
    <property name='VerificationDT' column='VERIFICATION_DT' type='DateTime' />
    <property name='VerifiedBy' column='VERIFIED_BY' type='String' />
    <property name='VefificationSourceCD' column='VEFIFICATION_SOURCE_CD' type='String'/>

    <many-to-one name="EmploymentIncome" column="EMPLOYMENT_ID" />

</class>