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

现在有如下的业务需求:订单的基本信息(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; }
}

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

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

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

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修改过]

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

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

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

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

个人认为,不需要为了反向关联而苛求。
应该给个接口,GetOrder(),来返回order~

为了数据库中值的约束,需要外键的地方,还是最好加上