1

나는 이미이 질문을 Hibernate's forum에 묻었지만 여기에도 역시 묻습니다. 이상적으로는 TranslatedText지도 것 종속 개체 최대 절전 모드에서 복잡한 값 개체를 매핑하십시오

enter image description here

두 값 : 나는 TranslatedTextTranslation 값 개체의 값 의미를 유지하면서 다음과 같은 모델을지도하기 위해 노력하고있어

<component>Question이고 Translation<bag>이고, <composite-element>TranslatedText입니다.

Question 단 하나의 TranslatedText를 참조하는 경우지도 간단했을 것이다, 그러나 두를 참조하기 때문에 나는지도를하기 위해 값 (title 또는 description)을 유지하는 속성의 이름에 따라 판별 어떤 종류의 필요 Translation foreing 키는 (question_id,property_name,language_code)으로 구성됩니다.

하나의 문제는 propertyName이 모델의 일부가 아니며 Hibernate가 모델에서 가져 오지 않은 값을 삽입하도록 강제하는 방법을 찾지 못했기 때문입니다.

따라서 모델을 변경하고 TitleDescription 클래스를 도입하여 type을 디스크립터로 사용할 수있게하려고했습니다. 정말 많은 도움이되지 않았다 끝에

enter image description here

:

<component name="title" class="TranslatedText"> 

    <bag name="translations" table="Translation"> 
     <key> 
      <!-- PROBLEM: Could not find a way to create a custom join expression on question.id and question.title.type in here. --> 
     </key> 

     <composite-element class="Translation"> 
      <!-- PROBLEM: Could not found a way to make Hibernate insert title.type from here, without having this value on the Translation object. --> 
      <property name="languageCode" type="string" column="language_code"/> 
      <property name="text" type="string"/> 
     </composite-element> 
    </bag> 
    </component> 

TranslatedText

<many-to-one>와 함께 나는 내 개체로 매핑 TranslatedText에 의해 필요에 가까운 무언가를 얻을 수 있었다 Question을 사용하여 <many-to-one>을 입력 한 다음 내의 값 모음으로 Translation을 매핑하면되지만 그런 접근법을 사용하면 고아가 된 TranslatedTextTranslation을 쉽게 제거 할 수있는 방법이 없다는 것입니다. DB 트리거 나 예약 된 프로세스로이 작업을 수행해야합니다. 나는 Hibernate가 적절한 의미와 초기 모델을 매핑 할만큼 유연하지 인상있어이 시점에서

결론 만 잘하면 내가 틀렸다 그것을 할 수있는 방법이있다.

답변

1

값으로 매핑하는 방법을 찾지 못했습니다. 그러나 다음 해결책이 효과가 있으며 도움이 될 것입니다. TranslatedText을 삭제하고 Translation 컬렉션으로 Question을 직접 연결했습니다. 여기

@Entity 
public class Question { 
    @Id 
    private String id; 

    @JoinTable 
    @OrderColumn 
    @OneToMany(fetch = EAGER, cascade = ALL) 
    private List<Translation> titleTranslations; 

    @JoinTable 
    @OrderColumn 
    @OneToMany(fetch = EAGER, cascade = ALL) 
    private List<Translation> descriptionTranslations; 
} 

의 단점은 TranslationEntity 클래스이어야한다는 것입니다.

@Entity 
public class Translation { 
    @Id 
    private String id; 
    private String languageCode; 
    private String text; 
} 
+0

음,'그것이 내가 DB 제약과 규칙을 시행하지 않는 그래서 난 그냥, 그것을 제거 할 수없는 코드 당 하나 개의 번역을 보장으로 TranslatedText'는 유용하지만 모델로되지 않을 것 나타내는. 대신, 자바가 아닌'Set '을 사용할 수는 있지만, 실제로는 모델이 ColdFusion (끔찍한 언어)으로 작성 되었기 때문에 할 수 없습니다. java가 아닙니다. – plalx

+0

컨텍스트없이 제약 조건을 이해하는 것은 어렵지만 세 가지 클래스 모두를 @ @ Entity (각각은 고유 한 @Id를 갖습니다)하여 이러한 관계를 가질 수 있습니다. 괜찮 니? 그렇다면 그러한 구성을 준비 할 수 있습니다. –

+0

글쎄, 내가 말했듯이'TranslatedText'를 엔티티로 매핑함으로써 이미 그렇게 할 수 있었다. 그러나,'many-to-one'을 사용했기 때문에'cascade-delete-orphan'을 할 수 없습니다. 값 객체는'Date' 나'Integer'와 같은 단순한 불변 값입니다. 최대 절전 모드 구성 요소로 매핑하면 고아 문제가 해결됩니다. 나는 그런 일반적인 시나리오가 너무 힘들다는 사실에 놀랐다. – plalx