Мы просто интегрируем 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>
Кто-нибудь может мне помочь?
спасибо, что заранее.
Почему 'locationId' является частью первичного ключа для пользователей и групп? Я думаю, что это корень вашей проблемы - вы пытаетесь использовать один и тот же столбец как часть составных клавиш для нескольких сопоставлений. Так почему же так? У вас будет несколько пользователей с одним и тем же 'userId', которые будут только дифференцированы по их местоположению? – dcsohl
Попробовать googling 'create hbm.xml из sql-ошибки следует сопоставить с insert =" false "update =" false "'. Например, [Как я могу сопоставить «insert =« false »update =« false ») в ключевом свойстве составного идентификатора, который также используется в FK?» (Https://stackoverflow.com/q/4892925/3404097). – philipxy