单向关联的hibernate映射如何实现。急求教!谢谢

10-08-06 lovko
现在有如下的业务需求:订单的基本信息(Order)与订单收件人信息(Consignee)分别是两个对象,这里我建模的时候定义Order为实体,Consignee为值对象(这个值对象的理解不知道有没有问题),而且模型关型是一个Order聚合根导向Consignee的一个单向关联。但是在hibernate映射的时候不知道如何映射这种关系。下面贴出一些简单的代码,希望大家给予帮助。谢谢!

    /// <summary>
    /// 订单
    /// </summary>
    public class Order
    {
        public Money Amount { get; set; }
        //……
        /// <summary>
        /// 收件人信息(存储在与订单一对一对关系的一张数据表中)
        /// </summary>
        public Consigneee Consignee { get; set; }
    }

    /// <summary>
    /// 收件人
    /// </summary>
    public class Consignee
    {
        public virtual string ConsigneeName { get; set; }
        public virtual string Address { get; set; }
    }
<p>

如上面所示,Order通过属性对Consignee进行了引用。但是Consignee没有对Order的一个反向关联,因为业务上不需要,而且感觉不合理。但是这样一个模型在配置Nhibernate的映射时遇到了麻烦,不知道如何配置,请有经验的朋友帮忙处理下。谢谢了。

         

banq
2010-08-06 10:27
2010年08月06日 09:25 "lovko"的内容
Consignee没有对Order的一个反向关联,因为业务上不需要,而且感觉不合理。但是这样一个模型在配置Nhibernate的映射时遇到了麻烦, ...

业务上一般不需要,双向关联越少越好,但是Hibernate这样的技术工具没有双向关联就性能很差,所以,你就必须使用,尽管从设计角度讲这是不好的,这说明Hibernate或NHibernate的局限之处。等有好的再说吧。

lovko
2010-08-06 10:31
2010年08月06日 10:27 "banq"的内容
但是Hibernate这样的技术工具没有双向关联就性能很差,所以,你就必须使用,尽管从设计角度讲这是不好的,这说明Hibernate或NHibernate的局限之处。等有好的再说吧 ...

banq的意思是为了能正常的使用Nhibernate进行映射我们必须建立双向的引用关联是吗?就是领域作出牺牲是吗?在这个例子里就添加Consignee指向Order的引用是吗?

banq说没有双向关联“性能很差”,可不可以理解成,是可以配置出单向关联的xml文件呢?

------------------------------------------------------------------

还有另个一个问题:如果做了Order.Consignee的关联和Consignee.Order的双向关联,但是配置好之后,发现使用的时候我这边如果在持久的时候如果想同时处理掉Order和Consignee的话,发现需要如下的代码:

Order order=new Order();

//order的赋值……

Consignee consignee = new Consignee();

//consignee的赋值……

order.Consignee = consignee ;

consignee.Order = order;(如果缺少这一步,发现nhibernate无法将consignee存储到数据库中)

不知这个问题是正常的还是我配置出错了?

希望banq辛苦下,都给个回复,谢谢

[该贴被lovko于2010-08-06 10:38修改过]

[该贴被lovko于2010-08-06 10:47修改过]

banq
2010-08-06 10:51
2010年08月06日 10:31 "lovko"的内容
想同时处理掉Order和Consignee的话 ...

是的,这是保证对象唯一性,你可以在Order构造器中加入对其子对象的构造赋值语句,或者通过专门的工厂来创建。

lovko
2010-08-06 11:06
2010年08月06日 10:51 "banq"的内容
你可以在Order构造器中加入对其子对象的构造赋值语句,或者通过专门的工厂来创建。 ...

[该贴被lovko于2010-08-06 11:10修改过]

[该贴被lovko于2013-04-23 21:23修改过]

猜你喜欢
2Go 1 2 下一页