2015-02-06 2 views
0

Мы просто интегрируем Hibernate в наше веб-приложение, которое было разработано с сегодняшнего дня, используя прямые запросы к реляционной базе данных. Мы создали файлы hbm.xml, чтобы иметь все сущности и отображения, реализованные для доступа к базе данных через спящий режим для чтения и записи.Внешний ключ в первичном ключе compiste (ошибка дублированного столбца)

Дело в том, что наша схема имеет много составных первичных ключей, и из-за этого у нас есть много внешних ключей, ссылающихся на эти составные идентификаторы.

Выше вы можете увидеть пример схемы базы данных, в которой у нас много проблем. Существует также файл hbm.xml:

<class name="Profile" table="Profile" optimistic-lock="version"> 
    <id name="profileId" type "java.lang.Integer"> 
     <column name="profileId" /> 
     <generator class="assigned" /> 
    </id> 
    <many-to-one name="location" class="Location" fetch="select" > 
     <column name="locationId" length="3" not-null="true" /> 
    </many-to-one> 
    <many-to-one name="users" class="Users" fetch="select"> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="userId" length="30" not-null="true" /> 
    </many-to-one> 
    <many-to-one name="groupUsers" class="GroupUsers" fetch="select"> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="groupUserId" length="30" not-null="true" /> 
    </many-to-one> 
</class> 

<class name="Users" table="Users" optimistic-lock="version"> 
    <composite-id name="id" class="UsersId"> 
     <key-property name="locationId" type="string"> 
      <column name="locationId" length="3" /> 
     </key-property> 
     <key-property name="userId" type="string"> 
      <column name="userId" length="30" /> 
     </key-property> 
    </composite-id> 

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="userId" length="30" not-null="true" /> 
     </key> 
     <one-to-many class="Profile" /> 
    </set> 
</class> 

<class name="GroupUsers" table="GroupUsers" optimistic-lock="version"> 
    <composite-id name="id" class="GroupUsersId"> 
     <key-property name="locationId" type="string"> 
      <column name="locationId" length="3" /> 
     </key-property> 
     <key-property name="groupUserId" type="string"> 
      <column name="groupUserId" length="30" /> 
     </key-property> 
    </composite-id> 

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="groupUserId" length="30" not-null="true" /> 
     </key> 
     <one-to-many class="Profile" /> 
    </set> 
</class> 

<class name="Location" table="Location" optimistic-lock="version"> 
    <id name="locationId" type="string"> 
     <column name="locationId" length="3" /> 
     <generator class="assigned" /> 
    </id> 

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select"> 
     <key> 
      <column name="locationId" length="3" not-null="true" /> 
     </key> 
     <one-to-many class="Profile" /> 
    </set> 
</class> 

При запуске Tomcat я получаю следующее сообщение об ошибке: «Профиль столбец: locationId (должен быть сопоставлен со вставкой =» ложных «обновление =„ложь“)»

Но если я пытаюсь поставить эти два атрибута в много-к-одному отношению файла Profile.hbm.xml, я не могу вставить экземпляр профиль в базе данных (без эффекта):

<many-to-one name="location" class="Location" fetch="select" insert="false" update="false"> 
     <column name="locationId" length="3" not-null="true" /> 
</many-to-one> 
<many-to-one name="users" class="Users" fetch="select"insert="false" update="false"> 
     <column name="locationId" length="3" not-null="true" /> 
     <column name="userId" length="30" not-null="true" /> 
</many-to-one> 
<many-to-one name="groupUsers" class="GroupUsers" fetch="select" insert="false" update="false"> 
     <column name="locationId" length="3" not-null="true" /> 
     <column name="groupUserId" length="30" not-null="true" /> 
</many-to-one> 

Кто-нибудь может мне помочь?

спасибо, что заранее.

+0

Почему 'locationId' является частью первичного ключа для пользователей и групп? Я думаю, что это корень вашей проблемы - вы пытаетесь использовать один и тот же столбец как часть составных клавиш для нескольких сопоставлений. Так почему же так? У вас будет несколько пользователей с одним и тем же 'userId', которые будут только дифференцированы по их местоположению? – dcsohl

+0

Попробовать googling 'create hbm.xml из sql-ошибки следует сопоставить с insert =" false "update =" false "'. Например, [Как я могу сопоставить «insert =« false »update =« false ») в ключевом свойстве составного идентификатора, который также используется в FK?» (Https://stackoverflow.com/q/4892925/3404097). – philipxy

ответ

0

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

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

Это, конечно, зависит от того, как вы хотите интегрировать спящий режим. Могут быть причины сохранить старые комбинированные первичные ключи. Но maybeyou должен подумать об этом.

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