2011-09-06 2 views
1

다음과 같은 관계가 있습니다.
자동차는 사람이 소유하고 있습니다.
사람이 여러 자동차를 소유 할 수 있습니다.기본 키만 사용하는 Hibernate 프록시 로딩

public void insert(Car car, int idPersonOwner) 

내가 자신의 ID 주어진 특정 사람을 위해 차를 삽입 할 :이 서명과 웹 서비스를

<hibernate-mapping package="fr.recouv.scribe.core.bo"> 
<class name="Car" table="car"> 
<id name="id" column="id_car" unsaved-value="0"> 
    <generator class="sequence"> 
    <param name="sequence">car_id_car_seq</param> 
    </generator> 
</id> 
<many-to-one name="person" update="false" column="id_person" class="Person" /> 
<property 
</class> 

: 여기

는 차의 매핑입니다. 는 지금 내 코드는 다음과 같습니다

Car car = new Car(); 
Person owner = personDao.get(idPersonOwner); 
car.setPerson(owner); 
carDao.save(car); 

그리고 personDao.get (idPersonOwner)의 최대 절전 모드 구현은 보이는이 방법의

public Person get(in idPerson){ 
return session.get(Person.class, id); 
} 

단점 같은 :

  • 을 모든 Person 객체가로드 되어도 SQL 뷰에서 그의 ID 만 필요합니다.
  • (게으른 로딩이 거짓 등으로 설정처럼) 사람의 매핑이 발전하면 더 그 2 개 쿼리를 생성 할 수있는 작업

내 실제 해결 : 그것은 바로 정수

에 외래 키를 매핑하는 것이다
<property column="id_person" name="idPerson" /> 

이 솔루션은 객체 지향적이지 않고 덜 아름답습니다. 그리고 내가

거짓 내가 이전 및 업데이트와 같은 사람 개체를 다시 매핑 할 필요가 자동차의 소유자를 = 검색해야 내일 경우는 사람의 프록시가 함께 발생합니다 자신의 ID를 부여로드 가능 을 쿼리하여이 사람이 기본 키와 함께 있는지 확인하고 선택적으로 다른 필드를 호출하는 경우 게으른 모드로로드합니다.

나는 session.load를 시도했지만 해결책은 아닙니다. 객체는 null이 아니며 (존재 여부를 테스트하는 쿼리가 없음) 다른 필드 에 액세스하여 데이터베이스에서 실제 객체를로드 할 때까지 객체가 throw되지 않습니다.

답변

3

예, 바로 그게 session.load (JPA를 사용하는 경우 EntityManager.getReference)입니다. 엔티티가 존재한다고 가정하고 오브젝트에 프록시를로드합니다.

물론 사람이 실제로 존재하지 않기 때문에 커밋 시간에 외래 키 제약 조건이 깨지는 경우 예외가 발생할 수 있습니다. 그러나 커밋하기 전에 다른 트랜잭션이 사람을 삭제하는 경우 Session.get으로 처리 할 수도 있습니다.

Number count = 
    session.createQuery("select count(p.id) from Person p where p.id = :theId") 
      .setLong("theId", theId) 
      .uniqueResult(); 
if (count.intValue() > 0) { 
    Person p = session.load(Person.class, theId); 
} 
else { 
    // throw exception 
} 
+0

내가 기대했다 : 당신은 정말 사람이 존재 함을 확인하고 싶다면 당신은 그 사람의 존재를 알고있을 때, 단지 부울을 반환 전용 쿼리 (또는 카운트) 및 사용 Session.load을 실행

그 최대 절전 모드는 이미 그걸 위해 뭔가를 가지고있다 : (그러나 당신의 대답에 큰 감사 !!! –

관련 문제