2011-08-29 4 views
6

JPA를 사용하여 데이터베이스 (60 개 테이블)의 테이블을 매핑하려고합니다. 다국어 지원을 위해이 작업을 수행하고 있으므로 모든 데이터가 하나 이상의 언어로 제공되어야합니다.JPA에서 i18n 테이블 매핑

내 데이터베이스 테이블 구조는 다음과 같습니다. RegionLanguage 테이블과 관련된 Region 테이블이 있습니다. RegionLanguage 테이블은 실제로 해당 Region에 대한 설명을 다른 언어로 보유합니다. 이 다이어그램에서보기를 할 수 있습니다 :

enter image description here

는 JPA에 관해서

, 나는 열심히 가능한 한 적은 연결을 필요로하는 방식으로 매핑을 찾을 수 있습니다. 보조 테이블 개념을 사용하려고 시도했으나 @OneToMany 관계이므로 어떤 경우에는 실패합니다. 가급적 이러한 두 테이블을 단일 개체로 표시하는 솔루션을 생각하고있었습니다.

귀하의 도움에 감사드립니다.

미리 감사드립니다.

+2

이 문제에 대한 해결책을 찾았습니까? 그렇다면 대답 해 주시겠습니까? 우리는 같은 문제에 직면 해 있습니다. 아직 멋진 솔루션을 찾지 못했습니다. 대부분 N + 1 쿼리 결과이며, 우리는이를 원하지 않습니다. – wimvds

+0

어떤 JPA 공급자를 사용하고 있습니까? – siebz0r

+0

지역 및 지역 언어 간의 간단한 @OneToMany 연결이 왜 효과가 없는지 완전히 이해하지 못합니까? –

답변

0

이 이상한 다이어그램을 이해할 수 있을지 모르겠습니다 ... RegionLanguage에는 Region.id를 가리키는 일종의 외래 키가 있습니다. Region에 단 하나의 열만 있으면 ('다이어그램'에 표시된 것처럼) 'RegionLanguage'만 매핑하면 원하는대로 하나의 엔티티 만 갖게됩니다. --- 손실 된 정보 없음).

하지만 진지하게 어떻게 매핑하고 싶습니까? 이 같은

class Region { 
//.. the missing fields not shown in diagram 
    List<String> languages; // take only language to avoid creating separate entity for region language 
} 

또는 무언가 : 당신은 같은 것을 갖고 싶어 마십시오 테이블의 나머지는 당신의 국제화 테이블과 결합하는 방법을 언급하지 않았다 어떤 경우

class RegionInnerJoinRegionLanguage { 
// all fields from Region 
// all fields from RegionLanguage 
} 

합니다. 귀하의 설명에서, 나는 모든 테이블이 RegionLanguage에 fk를 가지고 있다고 생각합니다. 나는 지역 테이블이 사물의 웅대 한 계획에 어떤 용도로 사용되는지 모르겠습니다. 나는 그것이 언어 그룹화를위한 것 같아요 ... 나는이 '모델'스위스 (하나의 '지역'4 개 언어)를 상상합니다 ...하지만 여러 지역에서 사용되는 언어로 무엇을 할 것입니까? 프랑스, 영어 등 여러 언어 (각 지역마다 하나씩)를 가지려고하고 있으며 각 언어에 대한 모든 데이터가 곱 해져 있습니까?

나는 이것을 묻지 않는다는 것을 안다. 나는이 질문에 대해 당신의 데이터 구조를 단순화 시켰다고 생각한다 ... 너무 많이 당신이 정말로 달성하기를 원하는 것을 추측하기가 어렵다. 당신은 문자열의 접근 방법의 목록을 사용하려는 경우 어떤 경우

, 당신이 시도 할 수 있습니다 : 당신은 하나의 개체로 두 테이블을 넣어하려는 이유

@ElementCollection 
    @CollectionTable(name="RegionLanguage", 
     [email protected](name="regionID") // or whatever... it's not on your diagram. 
) 
    @Column(name="langage") 
    private List<String> langages; 

이 난 아직도 이해가 안 .. . '읽기 전용'데이터 인 경우보기를 작성하고 매핑하면됩니다. 항상 '출구'로 표시됩니다.). 그러나 그것은 내 마음에 (사실 그들 둘 모두의) 과잉 합병증입니다. 그것은 미래에 당신을 물으려 할 것입니다. 나의 충고는 '단순한 OneToMany 매핑'을 사용하는 것이다.