나는 이미이 질문을 Hibernate's forum에 묻었지만 여기에도 역시 묻습니다. 이상적으로는 TranslatedText
지도 것 종속 개체 최대 절전 모드에서 복잡한 값 개체를 매핑하십시오
로
두 값 : 나는 TranslatedText
및 Translation
값 개체의 값 의미를 유지하면서 다음과 같은 모델을지도하기 위해 노력하고있어
<component>
은 Question
이고 Translation
은 <bag>
이고, <composite-element>
은 TranslatedText
입니다.
Question
단 하나의 TranslatedText
를 참조하는 경우지도 간단했을 것이다, 그러나 두를 참조하기 때문에 나는지도를하기 위해 값 (title
또는 description
)을 유지하는 속성의 이름에 따라 판별 어떤 종류의 필요 Translation
foreing 키는 (question_id,property_name,language_code)
으로 구성됩니다.
하나의 문제는 propertyName
이 모델의 일부가 아니며 Hibernate가 모델에서 가져 오지 않은 값을 삽입하도록 강제하는 방법을 찾지 못했기 때문입니다.
따라서 모델을 변경하고 Title
및 Description
클래스를 도입하여 type
을 디스크립터로 사용할 수있게하려고했습니다. 정말 많은 도움이되지 않았다 끝에
:
<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
을 매핑하면되지만 그런 접근법을 사용하면 고아가 된 TranslatedText
과 Translation
을 쉽게 제거 할 수있는 방법이 없다는 것입니다. DB 트리거 나 예약 된 프로세스로이 작업을 수행해야합니다. 나는 Hibernate가 적절한 의미와 초기 모델을 매핑 할만큼 유연하지 인상있어이 시점에서
음,'그것이 내가 DB 제약과 규칙을 시행하지 않는 그래서 난 그냥, 그것을 제거 할 수없는 코드 당 하나 개의 번역을 보장으로 TranslatedText'는 유용하지만 모델로되지 않을 것 나타내는. 대신, 자바가 아닌'Set'을 사용할 수는 있지만, 실제로는 모델이 ColdFusion (끔찍한 언어)으로 작성 되었기 때문에 할 수 없습니다. java가 아닙니다. –
plalx
컨텍스트없이 제약 조건을 이해하는 것은 어렵지만 세 가지 클래스 모두를 @ @ Entity (각각은 고유 한 @Id를 갖습니다)하여 이러한 관계를 가질 수 있습니다. 괜찮 니? 그렇다면 그러한 구성을 준비 할 수 있습니다. –
글쎄, 내가 말했듯이'TranslatedText'를 엔티티로 매핑함으로써 이미 그렇게 할 수 있었다. 그러나,'many-to-one'을 사용했기 때문에'cascade-delete-orphan'을 할 수 없습니다. 값 객체는'Date' 나'Integer'와 같은 단순한 불변 값입니다. 최대 절전 모드 구성 요소로 매핑하면 고아 문제가 해결됩니다. 나는 그런 일반적인 시나리오가 너무 힘들다는 사실에 놀랐다. – plalx