2009-11-17 56 views
1

认为2个实体OneToOne映射。人和汽车。一个人可以有一辆车。这可能在休眠3.2

我们有一个从数据库加载的Person对象。 我想换个人的车。问题是我没有加载的Car对象使用。相反,我只有车的ID。使用这个车标,是否可以将Person's Car设置为该需要的车(我们拥有该车),而无需从DB加载/选择任何车?而不是保存这个人,它的车到db。我不需要获取任何有关的信息。我只需要告诉Hibernate我想让Person's Car成为拥有该Id的车。

这可能吗? 对不起,如果我的英语sux。 谢谢你的建议。

回答

0

这取决于您的关联如何映射。

假设它通过外键映射(从Person到Car),并且您确定“new”car实际存在,您可以使用Session.load()方法返回新Car实体的持久代理,然后将其设置为人并保存人员。汽车不应实际装载只要联想不急于获取:

Person person = ...; 
Car newCar = session.load(Car.class, newCarId); 
person.setCar(newCar); 
session.saveOrUpdate(person); 

如果你的公会是通过主键映射,设置新的汽车是不可能的开始。

在一个侧面说明,个人对汽车在技术上是一个一对多的(人=所有者)或许多一对多(人=驱动器)之间的关系,而不是一个对一个。

+0

感谢您的回答。我同意你关于一对多的关系。但人与车的例子很容易解释。 如果代码运行在远程客户端/无法管理的情况下,情况如何?这可能没有.load()?任何代理汽车或代理只有id,而没有会议可用或远程呼叫?比我们发送我们的对象到服务器和saveOrUpdate(人)=)。 – Ginnun 2009-11-17 00:44:53

+0

远程API是另一回事。几种可能的选择是:(1)让远程客户端调用您的API来检索新车实例并进行设置; (2)通过你的API暴露“changeCarOnPerson(Person,NewCarId)”; (3)写一个CarProxy类(假设你的API允许)或者允许客户创建一个只有ID的Car实例,在Person上设置,让你的服务加载实际的Car实例。我必须说,选项#1是迄今为止**最干净的。 – ChssPly76 2009-11-17 00:54:58

+0

感谢您的答案。那些就是我的想法。 – Ginnun 2009-11-17 01:13:59