2010-03-10 4 views
3

주 테이블이 USER이고 다른 테이블에 CATEGORY (user_id 포함)가있는 구조가 있습니다. 표준 리버스 엔지니어링 절차 후 내가 가진 무엇최대 절전 모드 리버스 엔지니어링

:

  • 클래스 사용자가 카테고리의 컬렉션을 포함,
  • 클래스 카테고리가 외래 키 (USER_ID)를 포함하지 않았지만이 포함 않았다 User 객체.

외부 키가 클래스 속성으로 포함되지 않은 이유는 무엇입니까?

그리고 접착제없이이 두 테이블을 HQL에 어떻게 가입시킬 수 있습니까? HQL -이 부분을 설명해주십시오.

답변

3

외부 키가 클래스 속성으로 포함되지 않은 이유는 무엇입니까? 절전 모드가 개체 -Relational 매핑 툴이므로

가 절전 객체 모델에서 작동 할 수 있도록 (즉, 물체와 물체 사이의 관계) 및 데이터베이스 표현에 매핑 (테이블의 데이터 열). Hibernate의 전체적인 요점은 객체 지향 패러다임과 관계형 패러다임 (유명한 Object-Relational Impedance Mismatch) 사이의 갭을 해소하는 것이다.그리고 귀하의 경우에,이 다음 개체 모델은 기대된다 (오른쪽) 객체 표현 :

alt text http://img251.imageshack.us/img251/6335/110b578b.png

어떻게 내가 그 접착제없이 HQL이 두 테이블을 조인합니까?

접착제 입니다.하지만 개체 (및 연결)를 생각해야합니다. 예를 들어 (14.3. Associations and joins 참조) HQL 합류 결사의 두 가지 형태를 지원

from Category as category join category.user as user 

참고 및 암시 명시 (14.4. Forms of join syntax 참조). 위의 예에서는 명시 적 조인을 사용합니다. 내가 볼

from Category category where category.user.id =: id 
3

이 경우에는 Hibernate가 자동으로 외부 키를 처리합니다. 자바 쪽에서는 외래 키에 대해 생각할 필요가 없습니다. 그렇기 때문에 Category에는 FK가 아닌 User 개체 (참조)가 들어 있습니다. Category 클래스의 user 특성과 USER 테이블의 FK 열 간의 바인딩은 최대 절전 모드 매핑에 지정됩니다.

그런 다음 이러한 클래스를 사용하여 조건 또는 쿼리를 만들면 Hibernate는 적절한 FK를 사용하여 자동으로 SQL 쿼리를 생성합니다. 저는 HQL에 대한 경험이 없지만, Hibernate가 올바르게 처리했는지를 확신합니다.

업데이트 : HQL 예 : here 각색

from Category as category inner join fetch category.user as user 

예.

는 매핑에 대한 자세한 내용을 참조 Hibernate Reference, chapters 5

+0

다음 암시 형태는 가입 키워드 만 도트 표기법을 사용하지 않습니다. 내게는 User 객체와 외래 키를 모두 가지고있는 것이 당연합니다. 다른 사람들이 대답 할 것을 보도록하겠습니다. 고맙습니다. – EugeneP

+0

@EugeneP 내 업데이트 된 설명과 참조를 확인하십시오. 문제 해결에 도움이되기를 바랍니다. 자바 클래스에있는'User' 객체와 FK를 중복하면 더 많은 동기화가 필요하고 더 많은 오류 가능성이 열리게됩니다. 또한, PK와 FK는 종종 DB에 대해 프라이빗 (private)이어야한다. (그리고 이것은 Hibernate에서의 권장 사항이다.) –

+0

@EugeneP HQL 예제와 참조를 추가했습니다. –

0

I 피터 토록 동의 7. : 현재 최대 절전 모드 동작은 예상 하나입니다.

예를 들어 원시 FK가 아닌 사용자를 수정 한 범주를 업데이트 할 때 최대 절전 모드는 어떻게해야합니까?

왜 원시 FK가 필요합니까? category.getUser(). getId();를 수행하면됩니다. Category 객체에서 일관성없는 상태를 위험에 빠뜨리지 않고 액세스 할 수 있습니다.