2009-08-14 2 views
0

Проблема выглядит следующим образом:Hibernate WrongClassException/Sets/Discriminators?

  1. Продукт стол. 3 joined-subclasses: DVD, CD, Книга.

  2. Роль таблица (композитный идентификатор: NAME, роль, PRODUCT) и подклассы по колонку дискриминатора РОЛЬ: актер, режиссер, художник, автор, и т.д .., которые сопоставляются с Актер, режиссер, художник, автор классы java; (Довольно обычно, я думаю) ...

  3. Книга имеет авторов, на CD художников, DVD актеры и режиссеры - все они смоделированы с помощью set с one-to-many отношение указывает на класс предметы, например Автор, директор, художник и т.д .. которые только подклассы роли (см 2.)

До тех пор, как присоединился к подклассу имеет только один такой набор (из людей/ролей), все работает отлично. Но когда у него есть два, как DVD, актеры и режиссеры, Hibernate бросает исключение WrongClassException?

XML отрывок (Product.hbm.xml):

<joined-subclass name="media.DVD" table="V_DVD" lazy="false"> 

    <key column="IDPRODUCT"/> 
    <property column="FORMAT" name="format" type="string"/> 

    ... 
    <set name="actors" lazy="false"> 
     <key column="IDPRODUCT"/> 
     <one-to-many class="media.DVD$Actor"/> 
    </set> 

    <set name="directors" lazy="false"> 
     <key column="IDPRODUCT"/> 
     <one-to-many class="media.DVD$Director"/> 
    </set> 
    ... 
</joined-subclass> 

XML (Person.hbm.xml):

<class name="media.Person" table="V_ROLE"> 
    <composite-id> 
     <key-property column="NAME" name="name" type="string"/> 
     <key-property column="ROLE" name="role" type="string"/> 
     <key-many-to-one class="media.Product" column="IDPRODUCT" 
      name="product"/> 
    </composite-id> 

    <discriminator column="ROLE" insert="false" type="string"/> 

    <property name="name"/> 
    <property name="role"/> 

    <many-to-one class="media.Product" column="IDPRODUCT" 
     insert="false" name="product" update="false"/> 

    <subclass discriminator-value="author" name="media.Book$Author"/> 
    <subclass discriminator-value="artist" name="media.Music$Artist"/> 
    <subclass discriminator-value="creator" name="media.DVD$Creator"/> 
    <subclass discriminator-value="director" name="media.DVD$Director"/> 
    <subclass discriminator-value="actor" name="media.DVD$Actor"/> 

</class> 

Это кажется несколько хорошо для меня, но он бросает исключение. Спасибо за любую идею!

ответ

0

Должен сказать, что это довольно эзотерическое отображение. Почему вы используете сложный ключ (с дискриминатором, являющимся его частью не менее) вместо суррогата?

Возможно, вы можете вручную установить значение дискриминатора (через свойство role) в нечто иное, чем то, что должно быть для данного подкласса. Hibernate не сможет перезаписать его (дискриминатор сопоставляется с insert = "false"), и это приведет к ошибке WrongClassException при последующем выборе.

Возможно также, что в картине Product есть что-то фанк, из которого Media.DVD распространяется и который вы не включили. Можете ли вы добавить это, а также обеспечить полную трассировку стека?

0

Проблема в основном в том, что ваша модель не нормализована: вы указываете спящий режим, что есть составной ключ, но вы используете только часть этого ключа для ссылки на таблицу.

Я думаю, что вы можете реализовать это, либо имея набор людей в вашем продукте, и каждый человек имеет роль, либо путем сопоставления каждого набора отдельной таблицы с вашей личной таблицей.

Еще один эзотерический подход состоит в том, чтобы нанести на карту MultiMap: Фактически у вас есть в вашем продукте. Hibernate не поддерживает это из коробки, но I once wrote a UserType for this.

Приветствие,

-Maarten

+0

Не знаю, где вы получили это от. OP использует составной ключ для дочернего (Person), parent (media.DVD) имеет единственный (IDPRODUCT) ключ. – ChssPly76

 Смежные вопросы

  • Нет связанных вопросов^_^