Спящий режим один к одному с составными ключами

У меня есть проблема с моим файлом сопоставления, относящимся к отношениям один к одному, с составными первичными ключами, где имена полей ключей не совпадают.

Таблица 1:

<class entity-name="CompPkTest" table="compPkTest" catalog="data" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<composite-id mapped="false" unsaved-value="undefined">
  <key-property name="id1" type="int">
    <column name="id1"/>
  </key-property>
  <key-property name="id2" type="int">
    <column name="id2"/>
  </key-property>
</composite-id>
<property name="details" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never">
  <column name="Details" length="500"/>
</property>
<one-to-one name="CompPkTestDetail" entity-name="CompPkTestDetail" constrained="false" embed-xml="true"/>

Table 2:

<class entity-name="CompPkTestDetail" table="compPkTestDetail" catalog="data" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<composite-id mapped="false" unsaved-value="undefined">
  <key-property name="idetail1" type="int">
    <column name="idetail1"/>
  </key-property>
  <key-property name="idetail2" type="int">
    <column name="idetail2"/>
  </key-property>
</composite-id>
<one-to-one name="CompPkTest" entity-name="CompPkTest" constrained="true" embed-xml="true"/>
<property name="someDetail" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never">
  <column name="someDetail" length="300"/>
</property>
<property name="moreDetail" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never">
  <column name="moreDetail" length="300"/>
</property>

The problem is that when querying table 1, the "details" property is null. If I change the key-property names in CompPkTestDetail to be id1 and id2, (while leaving the column name unchanged), the relationship works as expected, and the query returns a value for "details".

Мои вопросы:

Является ли вышеприведенное сопоставление xml правильным способом создания этой ассоциации (с несовпадающими именами полей)?

Правильно ли hibernate навязывает, что имена полей должны совпадать, или это ошибка?

Обратите внимание, что в моем приложении нет классов для сущностей, а спящий режим находится в режиме карты. Мое приложение имеет полностью динамический доступ к (произвольным) базам данных, поэтому XML для сопоставлений создается во время выполнения.


person Memran    schedule 01.11.2012    source источник


Ответы (1)


<class entity-name="CompPkTest" table="compPkTest" >
  <composite-id>
    <key-property name="id1" column="id1"/>
    <key-property name="id2" column="id2"/>
  </composite-id>
  <one-to-one name="CompPkTestDetail" entity-name="CompPkTestDetail" property-ref="Parent"/>
</class>

<class entity-name="CompPkTestDetail" table="compPkTestDetail">
  <composite-id>
    <key-many-to-one name="Parent" entity-name="CompPkTest" >
      <column name="idetail1"/>
      <column name="idetail2"/>
    </key-many-to-one>
  </composite-id>
  <!--maybe needed if property-ref does not find the id property-->
  <property name="Parent" insert="false" update="false">
    <column name="idetail1"/>
    <column name="idetail2"/>
  </property>
</class>

Detail должен иметь нормальную ссылку на своего родителя, а Master ссылается на него. Я не уверен, что вам нужно указать свойство-ссылка в свойстве «один к одному» к свойству «Родитель».

person Firo    schedule 05.11.2012
comment
Спасибо, что нашли время ответить, однако приведенный выше метод приводит к исключению GenericJDBCException при выполнении запроса к CompPkTest, которое я пока не могу решить. - person Memran; 05.11.2012
comment
Вы пытались добавить свойство-ref? Где трассировка стека? - person Firo; 05.11.2012
comment
Извинения! Трассировка стека не имела отношения. Я не понимаю, куда поместить ссылку на свойство, потому что я думал, что это должно быть в теге «один/многие к одному» «дочернего элемента», но его нет. В любом случае, теперь при запросе (MAP в режиме объекта) значение карты для «подробности» равно нулю. (Когда идентификаторы совпадают, здесь есть объект). Надеюсь, это имеет смысл! - person Memran; 05.11.2012
comment
Еще раз спасибо, но все равно что-то не так. Caused by org.jboss.seam.InstantiationException with message: "Could not instantiate Seam component: test_1345107808962Factory" Caused by org.hibernate.InvalidMappingException with message: "Could not parse mapping document from resource test_1345107808962.dynamic.cfg.xml" Caused by org.hibernate.MappingException with message: "you must specify types for a dynamic entity: Parent" Но учитывая, что мои базы данных произвольны, я не знаю, как указать тип. (Помните, что мой XML генерируется во время выполнения путем изучения БД) - person Memran; 05.11.2012
comment
На данном этапе я не уверен, что смогу потратить на это слишком много времени, учитывая, что у меня есть (не очень приятный) обходной путь. Слишком много других дел. Я должен буду вернуться к этому позже. - person Memran; 05.11.2012