Hibernate Mapping один и тот же столбец дважды

Как можно исправить эту вещь

Повторяющийся столбец в сопоставлении для объекта: столбец com.abc.domain.PersonConnect: PERSON_ID (должен быть сопоставлен с вставкой = «ложь» обновление = «ложь»)

это фрагмент моего файла hbm

<class name="com.abc.domain.PersonConnect" table="PERSON_CONNECT">    
    <composite-id>
        <key-many-to-one name="Parent" class="com.abc.domain.Person" column="PARENT_PERSON_ID"/>
        <key-many-to-one name="Child" class="com.abc.domain.Person" column="CHILD_PERSON_ID"/>
    </composite-id>

    <many-to-one class="com.abc.domain.Person" fetch="select" name="parent" lazy="false" > 
        <column length="20" name="PERSON_ID" not-null="true"/> 
    </many-to-one> 
    <many-to-one class="com.abc.domain.Person" fetch="select" name="child" lazy="false" > 
        <column length="20" name="PERSON_ID" not-null="true"/> 
    </many-to-one>    
</class>

и таблица выглядит так

Person_Connect

  • ПК – PARENT_PERSON_ID
  • ПК — CHILD_PERSON_ID

Человек

  • ПК - PERSON_ID
  • ФИМЯ
  • LNAME

person Pradeep Kumar    schedule 28.09.2011    source источник
comment
Я хотел бы посмотреть, как выглядит ваша структура таблицы, как выглядит интересный сценарий.   -  person bittersweetryan    schedule 28.09.2011
comment
Я должен был сначала добавить таблицу.   -  person Pradeep Kumar    schedule 28.09.2011


Ответы (2)


Ваше сопоставление неверно, это правильное сопоставление. На стороне «многие к одному» имя столбца — это столбец в той же таблице, который является внешним, ссылающимся на первичный ключ Person.

<class name="com.abc.domain.PersonConnect" table="PERSON_CONNECT">

 <composite-id>
    <key-many-to-one name="Parent" class="com.abc.domain.Person" column="PARENT_PERSON_ID"/>
    <key-many-to-one name="Child" class="com.abc.domain.Person" column=" CHILD_PERSON_ID"/>
     </composite-id>

</class>
person gkamal    schedule 28.09.2011
comment
ой !!! я вижу, что я перепутал две разные вещи и попытался поставить все на одно место. Позвольте мне попробовать это, и я подтвержу, если это сработало. Спасибо еще раз. - person Pradeep Kumar; 28.09.2011
comment
Хорошо, это снимает проблему с составным идентификатором, но когда я пытаюсь определить внешний ключ «многие к одному», я снова оказываюсь в той же ситуации. ‹многие к одному class=com.abc.domain.Person fetch=select name=parent lazy=false › ‹длина столбца=20 name=PERSON_ID not-null=true/› ‹/many-to-one› ‹many -to-one class=com.abc.domain.Person fetch=select name=child lazy=false › ‹длина столбца=20 name=PERSON_ID not-null=true/› ‹/many-to-one› - person Pradeep Kumar; 28.09.2011
comment
то же исправление - многие к одному всегда ссылаются на внешний ключ другой таблицы - не имеет значения, является ли он ключом. - person gkamal; 28.09.2011

Ну, во-первых, маловероятно, что и «Родительский», и «Дочерний» должны быть сопоставлены с одним и тем же столбцом. Это, вероятно, проблема. В противном случае сделайте то, что говорит ошибка, и добавьте insert="false" update="false" к одному из сопоставлений столбцов. Столбец может "принадлежать" только одному свойству. В противном случае вы можете попасть в неразрешимую ситуацию, когда одно свойство говорит, что значение должно быть x, а другое говорит, что оно должно быть y.

person Ryan Stewart    schedule 28.09.2011
comment
Я не вижу причин, по которым это маловероятно. У человека есть два родителя, и нам нужно сопоставить его идентификатор, и у него есть двое детей, и также нужно сопоставить его с их идентификатором. - person Pradeep Kumar; 28.09.2011
comment
@Pradeep: Да, но это сопоставление говорит о том, что Родитель и Ребенок - одно и то же лицо. Вы только убеждаете меня, что вместо одного столбца PERSON_ID вы должны сопоставлять два отдельных столбца PARENT_ID и CHILD_ID. - person Ryan Stewart; 28.09.2011
comment
Я должен был сначала добавить таблицу. Пожалуйста, объясните подробнее, как родитель может быть ребенком в такой ситуации. - person Pradeep Kumar; 28.09.2011
comment
@Pradeep: Вы только что доказали мою точку зрения. В классе PersonConnect в отношении «многие к одному» (либо часть составного идентификатора, либо нет) вы должны указать имя столбца столбца в таблице Person_Connect. В этой таблице нет PERSON_ID. Имена столбцов, которые вы сопоставляете, должны быть PARENT_PERSON_ID и CHILD_PERSON_ID. Избавьтесь от своей фиксации на PERSON_ID. Его вообще не следует упоминать в отображении PersonConnect. - person Ryan Stewart; 28.09.2011
comment
хорошо, понял, но как он поймет, где он отображается в Person - person Pradeep Kumar; 28.09.2011
comment
Как по ссылке guide, отношения по умолчанию используют первичный ключ целевого объекта. Hibernate знает, что вы сопоставляете с Person, и он знает, что такое первичный ключ Person. Нет необходимости давать ему какую-либо другую информацию. - person Ryan Stewart; 28.09.2011