0

我有 2 个实体,车辆和司机。车辆有司机。在 Hibernate 生成的 Vehicle 类中,这种表示法由...表示

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

在数据库中,以下是场景......

table vehicle
    id INT
    name VARCHAR(20)
    driverId INT

table driver
    id INT
    name VARCHAR(45)

我正在创建一个车辆并想分配一个现有的驱动程序。使用 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

4

3 回答 3

2

Driver保存新的Vehicle.

// 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()to get对应Driver是一个不错的选择,可以避免SQL SELECT到数据库。在您读取其上的属性之前,该driver对象不会被完全初始化。只有这样SQL SELECT才会发出。

于 2012-09-16T18:14:48.013 回答
0

你可以这样做:

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

v.setDriver(temp);

session.merge(v);

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

于 2012-09-16T18:14:58.497 回答
0
try {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(userDetails);
        Long userId = userDetails.getId();
        session.getTransaction().commit();
        session.close();
        logger.info("Successfully added the user");
        return userId;
    } catch (Exception e) {
        logger.error("error in saving the user in user table", e);
    }
于 2018-05-28T06:20:02.470 回答