2012-04-24 2 views
1

관계 마스터 슬레이브가 있다고 가정합시다. 데이터베이스에는 id = 1 인 마스터 테이블에 한 행이 있습니다. 왜이 다음 코드 작업을 수행합니다분리 된 엔티티를 참조하는 것이 왜 작동합니까? jpa hibernate

Slave slave = new Slave(); 
    slave.setId(1L); 

    Master master = new Master(); 
    master.setId(1L); 
    slave.setMaster(master); 
    em.persist(slave); 

그래서 마스터가 분리되어 법인을 이후 생성 슬레이브와 마스터 사이 refence을 커밋합니다. 왜? 나는 thikinf의 경우에 "find"함수를 사용하여 데이터베이스에서 Master 행을 읽어야한다고 생각합니다. 어디서 더 읽을 수 있습니까?

+0

트랜잭션 경계는 무엇인가의 의미에 관심을? 엔티티는 어떻게 주석을 달았습니까? 자세한 내용을 보려면 JPA 2.0 사양을 읽으십시오. –

+0

이 경우 JPA는 주어진 마스터의 ID 만 사용합니다. 이미 테이블에 ID 1L의 마스터가 있으므로 JPA는 새로 생성 된 슬레이브를 삽입합니다. –

답변

1

최대 절전 모드 관계의 어두운 땅에 오신 것을 환영합니다. 우선 모든 당신이 당신을 위해 콘솔에서 Hibernate에 의해 수행 된 모든 SQL 쿼리를 볼 것에

<property name="show_sql">true</property> 

감사에가는 당신의 hibernate.cfg.xml에 추가되는 것을 배우고 싶은 경우에 - 그 그림에 가장 좋은 방법을 Hibernate가 주어진 순간에 작동하는 방법을 알아 내라.

예기치 않은 결과로 돌아 가기. 중요한 것은 누가 관계를 소유하고 있는지입니다. 귀하의 경우에 나는 슬레이브 테이블에 마스터 테이블 기본 키를 가리키는 외래 키가 있다고 추측합니다 (분명히 당신은 또한 조인 테이블을 사용할 수 있습니다 - 상관 없습니다).

Hibernate는 관계를 생성 할 때 관계를 소유하는쪽에 대해서만 관심을가집니다 - 귀하의 경우에는 새로운 관계에 대한 정보를 슬레이브 테이블에 저장하는 것으로 충분합니다. 실제로 Master는 관계에 대해 알 필요가 없으므로 해당 엔티티에서 save를 호출 할 필요가 없습니다. 이것이 코드가 작동하는 이유입니다.

도움 읽기 :

+0

최대 절전 모드가 마스터 엔티티가 관리되는지 여부를 확인하지 못했습니다. – dpolaczanski

관련 문제