2011-03-06 1 views
4

내 엔티티에서 간단한 OneToOne 매핑을 구성했지만 개체를 ​​유지할 때 삽입하기 바로 전에 최대 절전 모드에서 실행되는 "선택"문을 보았고 이유를 모르겠습니다.Hibernate OneToOne 매핑은 insert 전에 select 문을 실행한다. 확실하지 않은 이유

@Entity 
@Table(name = "USER") 
public class NewUser { 

    @OneToOne 
    @JoinColumn(name="user_status_type_id", nullable=false) 
    private UserStatusType userStatusType; 

UserStatusType은 읽기 전용 조회 테이블이므로 사용자를 저장할 때 그 테이블에 아무 것도 나타나지 않습니다. 나는 사용자 개체를 계속 될 경우에는 다음과 같이

User u = new User(); 
u.setUserStatusType(new UserStatusType(101)); 
session.persis(u); 

는하지만, 최대 절전 모드에서 출력을 읽 즉 최대 절전 모드 정상인지

Hibernate: select userstatus_.user_status_type_id, userstatus_.user_status_name as user2_3_ from USER_STATUS_TYPE userstatus_ where userstatus_.user_status_type_id=? 
Hibernate: insert into USER (created, first_name, last_name, password, user_name, user_status_type_id) values (?, ?, ?, ?, ?, ?) 

모르겠어요. 나는 "지속 (persist)"연산 이었기 때문에 Insert 문만 보았을 것입니다. 선택 목적이 확실하지 않습니다.

매핑이 잘못 되었습니까?

+0

지속성과 지속성을 위해'userStatusType'에 의해 참조되는 개체는 무엇입니까? – axtavt

+0

원본 게시물을 더 자세히 업데이트했습니다 – user646584

답변

5

좋아, 나는 Hibernate 공개 토론에서 응답을 얻을 수 있었다. INSERT 이전에 SELECT를 방지하려면 참조 된 행이 데이터베이스에 존재하는지 확인한 다음 Session.load() 또는 EntityManager.getReference()를 사용하십시오.

User u = new User(); 
u.setUserStatusType(session.load(UserStatusType.class, new Long(id)); 
session.persis(u); 

session.load() 메서드는 처음에는 아무것도로드하지 않고 개체에 대한 프록시를 만들고 데이터베이스에 대한 피해를 방지합니다. 이제 세션 컨텍스트 내에서 클래스의 멤버 (id 필드 제외)에 액세스하려면 Hibernate가 데이터베이스로 이동합니다. 필자의 경우 INSERT를 위해 참조 된 개체의 기본 키가 필요하기 때문에 데이터베이스가 손상되는 것을 막을 수있었습니다.

+0

@ user646584 멋진 연구! 틱 박스를 클릭하여 자신의 대답을 수락 할 수 있습니다. – vidstige

+0

이 동작의 이유를 설명 할 수 있습니까 (삽입하기 전에 선택)? –

관련 문제