Hibernate один ко многим картам - PullRequest
       20

Hibernate один ко многим картам

3 голосов
/ 03 сентября 2010

У меня есть две таблицы:

<class name="Content" table="language_content" lazy="false">
    <composite-id>  
        <key-property name="contentID" column="contentID"/>  
        <key-property name="languageID" column="languageID"/>           
    </composite-id> 
    <property name="Content" column="Content" />
</class>

и

<class name="SecretQuestion" table="secretquestions" lazy="true">
    <id name="questionID" type="integer" column="QuestionID">
        <generator class="increment"></generator>
    </id>
    <property name="question" column="Question"/>
    <property name="isUsing" column="IsUsing"/>
    <bag name="contents" inverse="true" cascade="all,delete-orphan">
        <key column="question" />
        <one-to-many class="Content" />
    </bag>
</class>

Я пытаюсь сопоставить свойство "question" SecretQuestion с Свойство "contentID" Контента, но Eclipse выдает исключение:

org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.sms.model.entity.SecretQuestion.contents#1]

Если я заменю <key column="question" /> на <key column="contentID" />, он может работать, но отображать неверные данные (фактически, какнасколько я вижу, он сопоставляет вопрос с идентификатором контента)

Кто-нибудь знает, как сделать то, что я пытаюсь достичь здесь?

Спасибо.

UPDATE

Окей, после изменения, как сказал Паскаль, вот новая ошибка:

javax.servlet.ServletException: org.hibernate.MappingException: Foreign key (FKB65C9692FCD05581:language_content [contentID,languageID])) must have same number of columns as the referenced primary key (secretquestions [QuestionID])

Эта ошибка означает, что у меня должен быть составной первичный ключ для таблицы секретных сообщений, котораяЯ не хочу: (

ОБНОВЛЕНИЕ

Я приведу пример, чтобы прояснить, что я пытаюсь сделать:

Table SecretQuestion
questionID* question answer
1           4        a
2           5        a
3           6        a

Table Content
contentID* languageID* content
1          1           a
1          2           b
2          1           c
2          2           d
3          1           e
3          2           f
4          1           g
4          2           h
5          1           i
5          2           j
6          1           k
6          2           l

Теперь я хочу сопоставить вопрос 4, 5, 6 с идентификатором контента 4, 5, 6.

1 Ответ

1 голос
/ 15 ноября 2010

Похоже, что этот подход не может работать и не поддерживается Hibernate (таблица содержимого имеет составной первичный ключ, хотя я хочу сопоставить его только с одним полем в таблице вопросов), поэтому я использую обходной путь, который отображает только вопроск contentID, и я использую класс ContentGetter, который будет получать содержимое в зависимости от languageID.

...