Столбец Hibernate Reference в таблице, чтобы указать, как отменять вызов атрибута в другом столбце в той же таблице. - PullRequest
1 голос
/ 11 февраля 2010

У меня есть сущность, которую я хочу сохранить в Hibernate (3.2) EntityBean имеет столбец, который указывает, как другое значение bean-объекта сущности должно быть разобранным:

<class name="ServiceAttributeValue" table="service_attribute_value">
      <cache usage="nonstrict-read-write"/>
      <id name="id" column="id" type="int-long">
         <generator class="native"/>
      </id>
      <property name="serviceAttribute" type="service-attribute" column="service_attribute" not-null="true" />
      <!-- order is important here -->
      <property name="value" type="attribute-value" not-null="true">
         <column name="service_attribute" />
         <column name="id_value"/>
         <column name="enum_value"/>
         <column name="string_value"/>
         <column name="int_value"/>
         <column name="boolean_value"/>
         <column name="double_value"/>
      </property>
   </class>

В столбце «service_attribute» указывается, какие из столбцов для свойства «value» следует просматривать, когда оно отменяет маршализацию значения, и, что более важно, точно, каким типом должно быть значение, например, класс Enum, если enum_value должен быть прочитан, или тип Бина, если значение id_value должно быть прочитано.

Свойство value использует собственный CompositeUserType для выполнения демаршаллинга, и в этом я хочу сослаться на столбец service_attribute (хотя и не записывать в него), однако при попытке сделать это я получаю следующую ошибку:

org.hibernate.MappingException: Repeated column in mapping for entity: com.precurse.apps.rank.model.service.ServiceAttributeValue column: service_attribute (should be mapped with insert="false" update="false")

Однако в определении составного свойства эти атрибуты xml не определены (только в обычном свойстве).

Кто-нибудь знает способ преодоления этого или есть лучшее решение этой проблемы.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать,

Приветствие Simon

Ответы [ 4 ]

1 голос
/ 12 февраля 2010

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

      <join table="service_attribute_value">
         <key column = "id" />
         <property name="serviceAttribute" type="service-attribute" column="service_attribute" not-null="true"  />
      </join>

      <!-- order is important here -->
      <property name="value" type="attribute-value" not-null="true">
         <column name="service_attribute" />
         <column name="id_value"/>
         <column name="enum_value"/>
         <column name="string_value"/>
         <column name="int_value"/>
         <column name="boolean_value"/>
         <column name="double_value"/>
      </property>
1 голос
/ 12 февраля 2010

У меня была похожая проблема, и изменение регистра одного столбца решило проблему. Могу попробовать!
например, один столбец может быть service_attribute другим Service_Attribute.

0 голосов
/ 12 февраля 2010

Я думаю, что нашел решение, хотя и не очень элегантное.

в

 public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
         throws HibernateException, SQLException {

метод CompositeUserType аргумент «владелец», передаваемый методу, содержит идентификатор объекта, атрибут service_attribute которого я хочу получить.

К сожалению, фактический атрибут serviceAttribute владельца недоступен или не был установлен на данном этапе (я поиграл с упорядочением элементов в конфигурации hbm.xml, на случай, если это было упорядочением, но, к сожалению, до сих пор нет радости), поэтому я не могу просто получить к нему доступ.

В любом случае, идентификатор объекта-владельца установлен, поэтому я затем использовал аргумент сеанса для запуска HQL-запроса на основе идентификатора для доступа к атрибуту serviceAttribute, который я затем использовал для правильного демаршаллинга свойства value.

Недостаток этого решения состоит в том, что он требует HQL-запроса в качестве накладных расходов для процесса демаршаллинга, хотя он находится в том же сеансе, но все еще не оптимален.

Если у кого-нибудь есть идеи для лучшего решения, я был бы очень признателен.

Приветствия

0 голосов
/ 11 февраля 2010

на основе вашего описания, кажется, что вы хотите создать разные подклассы на основе service_attribute.Вместо того, чтобы пытаться добиться повторного сопоставления столбцов, которое не разрешено в hibernate, вы можете посмотреть отображение наследования hibernate .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...