使用NHibernate接收索引超出范围

6 nhibernate nhibernate-mapping

我希望有人可以帮我解决这个问题.我一直在绞尽脑汁,我的项目很快到期.先感谢您.

插入新记录时,我收到超出范围异常的索引.在无休止地搜索信息后,有人建议我的映射中的列值与我的持久化类中的列值不匹配.但是,我计算并重新计算,它们似乎匹配.正如您在下面的代码中所看到的,我正在使用NHibernate.Mapping.Attributes来进行映射.也许我在那里做错了什么.

我终于下载了NHibernate源代码并通过我的问题进行了调试.下面是NHibernate试图构建的insert语句:

{插入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)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? )}

如您所见,参数数量与列表中的字段数相匹配.我还将这个生成的插入与我的类相匹配,我发现PSEQ和PCUST列与我的持久类无关.然后,在通过Dehydrate函数进行调试时,我发现了两个可能的问题.第一个是我注意到对NullSafeSet函数的调用将参数0设置为我的PSEQ字段应该设置为什么,但insert语句中的参数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;
Run Code Online (Sandbox Code Playgroud)

}

我的持久课程:

[NHibernate.Mapping.Attributes.Class(0,Schema = WTSLIB33T,Table ="PRODDATA",NameType = typeof(ProddataDAO),Lazy = true)] public class ProddataDAO:Object //:INotifyPropertyChanged {public 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;
    } 
Run Code Online (Sandbox Code Playgroud)

Tor*_*kel 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")]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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