2017-02-08 1 views
2

일부 데이터가 여러 언어로 저장되는 프로젝트에서 작업 중입니다. 지속성을 위해 나는 Spring Data JPA를 Hibernate와 함께 사용한다. 내 모델은 다음과 같은 : 나는의 값으로 MultilingualData 것을 사용하려는 나는 또한, 클래스가JPA 매핑 열의 i18n 문제

@Embeddable 
public class MultilingualData { 

    @Column(name = "locale", nullable = false) 
    @Convert(converter = LocaleConverter.class) 
    private Locale locale; 

    @Column(name = "value") 
    private String value; 
} 

그리고 :

내가 지정된 로케일에 문자열을 저장하기위한 임베디드 클래스가 Map 및 MultilingualData의 Locale을 더 나은 처리를위한 키로 사용합니다.

@Entity 
@Table(name = "multilingual_string") 
public class MultilingualString extends BaseEntity { 

    private static final long serialVersionUID = -2434353448112062292L; 

    @ElementCollection(fetch = FetchType.EAGER) 
    @MapKeyJoinColumn(name = "locale", insertable = false, updatable = false) 
    @CollectionTable(name = "multilingual_string_map", 
      joinColumns = @JoinColumn(name = "string_id")) 
    private Map<Locale, MultilingualData> localizedStrings; 

나는 MultilingualString를 사용하는 클래스 : JPA는 'multilingual_string_map'의 테이블을 생성 할 때

@Entity 
@Table(name = "location") 
public class Location extends BaseEntity { 

    private static final long serialVersionUID = 1L; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "name") 
    private MultilingualString name; 

그래서 두 개의 열이 로케일 자체 생성됩니다. 하나는 모델에 주어진 'locale'이라는 이름이고 다른 하나는 'localized_strings_key'를 기본 키의 일부로 만듭니다. 그래서 다국어 데이터를 저장하면 로켈이 두 번 저장됩니다.

불필요한 여분의 열을 제거하고 싶습니다. 맵핑을 올바르게 구성하지 않았다는 것을 알기 때문에 누군가 내 실수를 고칠 수 있기를 바랍니다. 미리 감사드립니다.

답변

0

왜 조인 열을 insertable = false으로 정의 하시겠습니까? 코드가 코드 내에서 채워지지 않을 것입니까?

어쨌든 @MapKeyJoinColumn은지도 키가 엔티티 인 경우에만 사용됩니다. @MapKeyColumn은 원하는 것입니다.

(@MapKeyColumn이 모델에서 누락 된 사실이 Hibernate가 localized_strings_key 즉 키 열에 대한 기본 이름을 사용하도록 강요했다 의미한다. locale 열이 또한 실체없는지도 키가에도 불구하고 창조있어 사실을 잘 , 문서화되지 않은 행동)