Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NHibernate获取/自动映射问题_Java_Nhibernate_Orm_Automapper_Dto Mapping - Fatal编程技术网

Java NHibernate获取/自动映射问题

Java NHibernate获取/自动映射问题,java,nhibernate,orm,automapper,dto-mapping,Java,Nhibernate,Orm,Automapper,Dto Mapping,好的,我现在有一个问题,要么是AutoMapper,我的NHibernate查询,要么是Domain/DTO设计 我遇到的问题是,当我进行提取时,例如ObjectA包含ObjectB的列表,ObjectB具有其父ObjectA的属性。当我有一个对我的ObjectA的ObjectB属性进行急切获取的查询时,我就可以无限地继续进行a.B.a.B.a.B.a.B.B.a.B等等 这意味着,当我尝试将域对象映射到包含相同交易的DTOA时,DTOA有一个DTOB列表,DTOB有其父DTOA的属性。我的服务

好的,我现在有一个问题,要么是AutoMapper,我的NHibernate查询,要么是Domain/DTO设计

我遇到的问题是,当我进行提取时,例如ObjectA包含ObjectB的列表,ObjectB具有其父ObjectA的属性。当我有一个对我的ObjectA的ObjectB属性进行急切获取的查询时,我就可以无限地继续进行a.B.a.B.a.B.a.B.B.a.B等等

这意味着,当我尝试将域对象映射到包含相同交易的DTOA时,DTOA有一个DTOB列表,DTOB有其父DTOA的属性。我的服务在返回时超时,因为我相信我正在使用AutoMapper将DomainA映射到DTOA,然后因为DTOA.DTOB.DTOA.DTOB等被无限序列化填充

不管怎么说,我确信最好的解决方案是一个古老的经典问题,但我正在努力找到合适的东西输入我的老朋友谷歌。我是否可以让AutoMapper忽略子对象中的父实例,甚至我认为如果我可以让Nhibernate获取列表,但在父属性上保留一个代理,我更愿意这样做。最糟糕的解决方案是使用特定场景或特定逻辑的对象更改域对象

谢谢你的帮助

编辑代码

映射代码

 Mapper.CreateMap<DTOA, DomainA>();
        Mapper.CreateMap<DomainA, DTOA>()
            .ForMember(dst => dst.AProperty,
                       opts =>
                       opts.ResolveUsing<LazyLoadResolver>().FromMember(src => src.AProperty));
Mapper.CreateMap();
Mapper.CreateMap()
.FormMember(dst=>dst.A属性,
选项=>
opts.ResolveUsing().FromMember(src=>src.apProperty));
域对象域

 /// <summary>
    /// Data Transfer Object, object representing a user
    /// </summary>
    public class DomainA
    {
        /// <summary>
        /// Gets or sets the clans.
        /// </summary>
        /// <value>The clans.</value>
        public virtual IList<DomainB> AProperty{ get; set; }
}
//
///数据传输对象,表示用户的对象
/// 
公共类域
{
/// 
///获取或设置族。
/// 
///家族。
公共虚拟IList属性{get;set;}
}
域对象域B

/// <summary>
/// DTO for clan members
/// </summary>
public class DomainB
{
    /// <summary>
    /// Gets or sets the ID.
    /// </summary>
    /// <value>The ID.</value>
    public virtual int ID { get; set; }

    /// <summary>
    /// Gets or sets the user.
    /// </summary>
    /// <value>The user.</value>
    public virtual DomainA BProperty{ get; set; }
//
///氏族成员的DTO
/// 
公共类域B
{
/// 
///获取或设置ID。
/// 
///身份证。
公共虚拟整数ID{get;set;}
/// 
///获取或设置用户。
/// 
///用户。
公共虚拟域BProperty{get;set;}
}

Nhibernate查询

return session.QueryOver<DomainA>()
                .Where(a => a.ID == id)
                .Fetch(a=> a.AProperty).Eager
                .List<DomainA>().FirstOrDefault();
return session.QueryOver()
.其中(a=>a.ID==ID)
.Fetch(a=>a.approperty)
.List().FirstOrDefault();
WCF服务返回语句

return AutoMapper.Map<DomainA, DTOA>(returnedDomainA);
return AutoMapper.Map(returnedDomainA);

使用fetching和dto域结构和自动映射器配置运行该查询意味着我的服务不会出错,我假设它正在尝试序列化,并且是无休止的循环,没有fetch和list为null,所有这些都可以正常工作,当然

,所以我决定使用这两个选项来解决这个问题

方案A

更改DomainB映射的自动映射器以忽略作为DomainA实例的DomainB上的属性

这意味着映射将是单向的,而不是双向的

方案B


从DomainB中删除DomainA属性!在考虑了我希望系统执行的操作后,我决定删除这些链接回家长的属性

请发布您的现有代码