我有一个一对多的关系,但我希望只有一个实例具有一对一的关系。
我有一个类别的车辆,可能有几个车主在他们的生命周期。我只想映射这个类来获取资产。有什么方法可以做到这一点吗?
问题出在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中引用当前的所有者。我不知道如何进行映射。
任何帮助都将不胜感激。谢谢
发布于 2009-04-21 13:48:23
一种简单的映射方法是将其转换为多对一关系,并将当前所有者的ID存储在vehicle表中。我知道这可能是模式更改。
一种方法是创建一个视图,该视图本质上是vehicle表,加上它将拉出当前的ownerid。这样,您就不必更改模式,然后就可以映射到视图而不是表。
我不确定在这种情况下定义自己的加载器是否有效,但这是另一个值得探索的选择。
编辑
我理解你的困境。最简单的方法是修改模式和应用程序来添加这个额外的列,一种伪造它的方法是使用视图。举个例子
select vehicle.*, owner.ownerid
from vehicle
inner join owner
on owner.vehicleid=vehicle.vehicle
and owner.enddate is null 我假设当前所有者的结束日期为空。现在,将映射更改为映射到视图而不是表。是的,这是一个黑客,但它会工作的。
我假设你仍然需要在nHibernate中映射所有者?另一种选择是在所有者的类映射上添加where筛选器,以筛选结束日期为空的筛选器。
您的另一个选择是加载所有所有者,并将定义当前所有者的业务规则推送到应用层。您的对象可能如下所示:
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);
}
}}
发布于 2009-04-21 13:52:06
在执行搜索时,可以使用Criteria (或Spring的DetachedCriteria )对象来限制附加值。
发布于 2009-04-21 13:59:41
我建议在业务层中维护此引用,并将其映射为多对一关系。我的意思是你在你的代码中显式地设置了这个引用。这还允许您直接查找当前车主的车辆。
示例:
<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;
}https://stackoverflow.com/questions/772637
复制相似问题