2012-09-16 50 views
0

我有2个实体,车辆&驱动程序。一辆车有一个司机。在由Hibernate产生的车辆类,这种记数法表示由...休眠保存实体

public class Vehicle 
{ 
    private Driver driver; 
    ... 
    ... 
    ... 
} 

在DB以下是该方案...

table vehicle 
    id INT 
    name VARCHAR(20) 
    driverId INT 

table driver 
    id INT 
    name VARCHAR(45) 

我创建一个汽车和想要分配现有的Driver。使用Hibernate,当我创建一个Vehicle对象,并保存它,我必须做以下...

// Load Driver 
Driver driver = (Driver) session.load(Driver.class, Integer.parseInt(iKnowTheDriverId)); 

// Create Vehicle 
Vehicle v = new Vehicle(); 
v.setDriver(driver); 

我需要加载相应的驱动程序实体每次或反正是有刚才设置的驱动程序ID?

在此先感谢...

SG

回答

2

您需要保存一个新Vehicle时得到一个参照相应Driver

// Load Driver 
Driver driver = (Driver) session.load(Driver.class, driverId); 

// Create Vehicle 
Vehicle v = new Vehicle(); 
v.setDriver(driver); 
v.setName("someName"); 

session.save(vehicle); 

但使用session.load()得到相应的Driver是一个不错的选择,以避免SQL SELECT到数据库中。 driver对象在读取其属性之前不会完全初始化。只有这样才能发行SQL SELECT

+0

这也可能导致EntityNotFound?但这正是我想避免的。在SQL中,我只需更新表列中的驱动程序ID。我想在这里采用类似的方法... – SSG

+0

“这也可能导致EntityNotFound?”不可以。如果你知道驱动程序的id,hibernate将始终返回引用。我假设驱动程序已经保存在数据库中。 – dcernahoschi

0

你可以这样做:

Driver temp = new Driver(); 
temp.setId(iKnowTheDriverId); 

v.setDriver(temp); 

session.merge(v); 

这可能是保存的方法之间存在一些差异,但如果你使用Session#合并(),它应该工作。然后它将通过检查它们的id来将分离的驱动程序与现有的驱动程序合并,并且分离的对象中的空值不会覆盖持久化状态中的非空值。只要确保您在Vehicle to Driver的引用中有CascadeType.MERGE/ALL。

+0

试过但不工作:( – SSG

+0

它以什么方式不起作用?您是否有从Vehicle到Driver的关联中的CascadeType.MERGE? – Tobb