2012-09-16 2 views
0

2 개의 엔티티, 차량 & 드라이버가 있습니다. 차량에는 운전자가 있습니다. Hibernate에 의해 생성 된 차량 클래스에서이 표기법은최대 절전 모드 저장 엔터티

table vehicle 
    id INT 
    name VARCHAR(20) 
    driverId INT 

table driver 
    id INT 
    name VARCHAR(45) 

가 나는 차량을 생성하고 할당 할입니다 ... DB에서

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

다음이 시나리오는 ...에 의해 표현된다 기존 드라이버. 나는 차량 객체를 생성하고 저장할 때 최대 절전 모드를 사용하여, 나는

// 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에 대한 참조를 얻을 필요가있다. 해당 Driver를 얻을 수 session.load()을 사용

// 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); 

는 그러나 데이터베이스에 SQL SELECT을 피하기 위해 좋은 선택이 될 것입니다. driver 개체는 속성을 읽을 때까지 완전히 초기화되지 않습니다. 그런 다음에만 SQL SELECT이 발급됩니다.

+0

이로 인해 EntityNotFound가 발생할 수도 있습니다. 그러나 이것은 제가 피하고 싶은 바로 그 것입니다. SQL에서는 테이블 열에서 드라이버 ID 만 업데이트합니다. 비슷한 방법을 원합니다 ... – SSG

+0

"이것도 EntityNotFound로 이어질 수 있습니까?" 아뇨. 운전수의 이드를 알면 최대 절전 모드로 전환됩니다. 드라이버가 이미 데이터베이스에 저장되어 있다고 가정합니다. – dcernahoschi

0

이 작업을 수행 할 수 있습니다

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

v.setDriver(temp); 

session.merge(v); 

그것은 저장-방법 사이에 약간의 차이가있을 수 있습니다,하지만 당신은 세션 # 병합을 사용하는 경우()가 작동합니다. 그런 다음 분리 된 드라이버를 ID로 검사하여 기존 드라이버와 병합하고 분리 된 객체의 null 값은 지속 상태의 not-null 값을 덮어 쓰지 않습니다. Vehicle to Driver에서 참조 할 때 CascadeType.MERGE/ALL이 있는지 확인하십시오.

+0

시도했지만 작동하지 않습니다 :( – SSG

+0

작동하지 않았습니까? CascadeType.MERGE가 차량에서 운전자 협회로 연결 되셨습니까? – Tobb

관련 문제