Сопоставление дополнительного столбца с составным идентификатором при сохранении для него сопоставления свойств

я использую промежуточный класс сущностей для сопоставления дополнительных столбцов с объединяемыми, и он отлично работает, пока идентификатор будет сгенерирован из обоих fkeys из задействованных таблиц.

Я хочу реализовать «ревизию» третьего столбца из того же класса сущностей в составной идентификатор, и мне все еще нужно использовать его с обычным сопоставлением свойств. Сопоставление составного идентификатора работает нормально, но обычное сопоставление для «ревизии» — нет.

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

Я был бы признателен за информацию о том, как правильно отобразить это, или за информативные ссылки об этом, спасибо за помощь.

«Первоначальное создание SessionFactory failed.org.hibernate.MappingException: ассоциация из таблицы backlogaufgabe ссылается на несопоставленный класс: int» будет отображаться с этим сопоставлением:

<hibernate-mapping package="app.domain">
 <class mutable="false" name="app.domain.BacklogAufgabe" table="backlogaufgabe">
  <composite-id class="BacklogAufgabe$Id" name="id">
   <key-property access="field" column="id_backlog" name="backlogId"/>
   <key-property access="field" column="id_aufgabe" name="aufgabeId"/>
   <key-property access="field" column="revision" name="revisionId"/>
  </composite-id>
  <property column="datum" name="datum" not-null="true" type="date"/>
  <property column="rang" name="rang" not-null="true" type="int"/>

  <property column="revision" name="revision" not-null="true" type="int"/>

  <property column="aufw_schaetzung" name="aufwSchaetzung" not-null="true" type="int"/>
  <property column="aufw_messung" name="aufwMessung" not-null="true" type="int"/>
  <many-to-one cascade="save-update" column="id_aufgabe" insert="false" lazy="false"
    name="aufgabe" not-null="true" update="false"/>
  <many-to-one cascade="save-update" column="id_backlog" insert="false" lazy="false"
    name="backlog"  not-null="true" update="false"/>
  <many-to-one cascade="save-update" column="revision" insert="false" lazy="false"
    name="revision" not-null="true" update="false"/>
 </class>
</hibernate-mapping>

SQL:

 CREATE TABLE backlogaufgabe
 (
   id serial NOT NULL,
   id_backlog integer NOT NULL,
   id_aufgabe integer NOT NULL,
   revision integer NOT NULL,
   datum date NOT NULL,
   rang integer NOT NULL,
   aufw_schaetzung integer,
   aufw_messung integer,
   CONSTRAINT backlogaufgabe_pkey PRIMARY KEY (id),
   CONSTRAINT backlogaufgabe_id_aufgabe_fkey FOREIGN KEY (id_aufgabe)
       REFERENCES aufgabe (id) MATCH SIMPLE
       ON UPDATE CASCADE ON DELETE RESTRICT,
   CONSTRAINT backlogaufgabe_id_backlog_fkey FOREIGN KEY (id_backlog)
       REFERENCES backlog (id) MATCH SIMPLE
       ON UPDATE CASCADE ON DELETE RESTRICT
 )
 WITH (
   OIDS=FALSE
 );

person MrMiyagi    schedule 30.06.2011    source источник


Ответы (1)


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

Попробуй это:

CREATE TABLE backlogaufgabe
(
   id_backlog integer NOT NULL,
   id_aufgabe integer NOT NULL,
   revision integer NOT NULL,
   datum date NOT NULL,
   rang integer NOT NULL,
   aufw_schaetzung integer,
   aufw_messung integer,
   CONSTRAINT backlogaufgabe_pkey PRIMARY KEY (revision),
   CONSTRAINT backlogaufgabe_id_aufgabe_fkey FOREIGN KEY (id_aufgabe)
       REFERENCES aufgabe (id) MATCH SIMPLE
       ON UPDATE CASCADE ON DELETE RESTRICT,
   CONSTRAINT backlogaufgabe_id_backlog_fkey FOREIGN KEY (id_backlog)
       REFERENCES backlog (id) MATCH SIMPLE
       ON UPDATE CASCADE ON DELETE RESTRICT
)
WITH (
   OIDS=FALSE
);
person cascadox    schedule 30.06.2011
comment
Привет, cascadox, спасибо за ответ. Ревизия должна быть избыточной, поэтому она не может быть pKey для таблицы. - person MrMiyagi; 30.06.2011