首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射hbm.xml

映射hbm.xml
EN

Stack Overflow用户
提问于 2009-04-21 13:37:57
回答 5查看 1.1K关注 0票数 1

我有一个一对多的关系,但我希望只有一个实例具有一对一的关系。

我有一个类别的车辆,可能有几个车主在他们的生命周期。我只想映射这个类来获取资产。有什么方法可以做到这一点吗?

问题出在hbm.xml文件中。一辆车在其生命周期中可能有多个车主,但我只想获得最后一个车主。我需要按vehiculeId、ownerId和EndDate进行过滤。我想用资产填充vehicle.cs中的对象所有者。

当我写的时候: Vehicule v= VehiculeService.SearchVehicule(id);

我希望v.Owner必须包含最后一辆车的车主。

我不能在vehicle表中存储车主的ID,因为车主依赖于日期。例如: Vehicle Owner StartDate EndDate 1 1 04/04/2009 04/10/2009 1 2 05/10/2009 NULL

因此,我必须按EndDate进行筛选才能拥有资产

我有三个表: Vehicle、Owner和OwnerVehicle。问题是我必须在vehicle.cs中引用当前的所有者。我不知道如何进行映射。

任何帮助都将不胜感激。谢谢

EN

回答 5

Stack Overflow用户

发布于 2009-04-21 13:48:23

一种简单的映射方法是将其转换为多对一关系,并将当前所有者的ID存储在vehicle表中。我知道这可能是模式更改。

一种方法是创建一个视图,该视图本质上是vehicle表,加上它将拉出当前的ownerid。这样,您就不必更改模式,然后就可以映射到视图而不是表。

我不确定在这种情况下定义自己的加载器是否有效,但这是另一个值得探索的选择。

编辑

我理解你的困境。最简单的方法是修改模式和应用程序来添加这个额外的列,一种伪造它的方法是使用视图。举个例子

代码语言:javascript
复制
select vehicle.*, owner.ownerid
from vehicle
inner join owner 
  on owner.vehicleid=vehicle.vehicle
and owner.enddate is null 

我假设当前所有者的结束日期为空。现在,将映射更改为映射到视图而不是表。是的,这是一个黑客,但它会工作的。

我假设你仍然需要在nHibernate中映射所有者?另一种选择是在所有者的类映射上添加where筛选器,以筛选结束日期为空的筛选器。

您的另一个选择是加载所有所有者,并将定义当前所有者的业务规则推送到应用层。您的对象可能如下所示:

代码语言:javascript
复制
public Owner CurrentOwner
{
    get 
    {
        return _owners.Find(o=>o.EndDate==DateTime.Min); //Or null if your using a nullable datetime
     }
    set 
    {
        CurrentOwner.EndDate=DateTime.Now;
        _owners.Add(value);
    }
}

}

票数 0
EN

Stack Overflow用户

发布于 2009-04-21 13:52:06

在执行搜索时,可以使用Criteria (或Spring的DetachedCriteria )对象来限制附加值。

票数 0
EN

Stack Overflow用户

发布于 2009-04-21 13:59:41

我建议在业务层中维护此引用,并将其映射为多对一关系。我的意思是你在你的代码中显式地设置了这个引用。这还允许您直接查找当前车主的车辆。

示例:

代码语言:javascript
复制
<class name="Vehicle">
  <map name=AllOwners" >
  ...
  </map>

  <many-to-one name="CurrentOwner" ...>
</class>

public class Vehicle
{
  IList<Owner> AllOwners { get; private set; }
  Owner CurrentOwner { get; set; }
}

public void SetNewOwner(Vehicle v, Owner o)
{
  v.AllOwners.Add(o);
  v.CurrentOwner = o;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/772637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档