0

私は2つのエンティティ、車両とドライバーを持っています。車両にはドライバーがいます。Hibernateによって生成されたVehicleクラスでは、この表記は...で表されます。

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

DBでのシナリオは次のとおりです...

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()、対応するものを取得するために使用することは、データベースへの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);

save-methodsの間にいくつかの違いがあるかもしれませんが、Session#merge()を使用すると機能するはずです。次に、IDをチェックして、分離されたドライバーを既存のドライバーとマージします。分離されたオブジェクトのnull値は、永続化された状態のnull以外の値を上書きしません。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 に答える