2012-05-14 1 views
1

Мне нужно сопоставить схему крупной корпоративной базы данных. Поскольку ряд устаревших приложений зависит от этой схемы, я не могу ее изменить из составных клавиш в суррогатные ключи (кроме использования представлений вместо триггеров для ~ 70% объектов базы данных), что привело меня к ряду проблем не знаю, как победить.Hibernate - сопоставление композитных отношений с непервичными ключами

  1. Как отобразить таблицы, которые имеют суррогатный ключ (первичный, автоматическое приращение) и составной уникальный ключ, к которому ряд таблиц образует много-к-одному отношения над суррогатным ключом, и в том же сколько унаследованных таблиц связано с уникальным композитом?
  2. Что делать, если несколько отношений по составным ключам разделяют один и тот же компонент (Naselja: Korisnik/Opcina, Korisnik/Grad)? Hibernate говорит мне, что я не могу использовать один и тот же столбец (Корисник) дважды, если не добавить «updatable = false, insertable = false» в аннотацию @JoinColumn. Но когда я это делаю, я получаю сообщение о том, что все компоненты отношения должны иметь одинаковые настройки для вставляемых и обновляемых. Как мне обновить или вставить второе отношение?
  3. Вставка строки в таблицу «Улис» даст мне ошибку «org.hibernate.AnnotationException: referendedColumnNames (Korisnik, Naselje) из lc.data.hibernate.Ulice.naselja, ссылающийся на lc.data.hibernate.Naselja не отображается на единственное свойство ", если в таблице« Naselja »я явно не добавляю отношение« один к одному »к таблице« Корисни »в модели, которая не отражает фактическую схему базы данных.

От того, что я до сих пор читал JPA doesn't support relationships to non-primary keys, но people still do it. Также моя вторая проблема might be solved with Hibernate 5, но я надеюсь на какой-то хороший совет, какой маршрут взять здесь.

модель испытания, скрипты базы данных и проекты:


Database schema MSSQL

MSSQL create database scripts

Java NetBeans example projects

+0

Одна из идей, которые у меня были, заключается в установке updatable = false , insertable = false для всех отношений Hibernate, явно отображающее каждое поле в ta и обрабатывать отношения вручную ... Это работает, но кажется очень неправильным :) – Vedran

ответ

2

1) - отобразить автоинкрементом столбцы как первичный ключ - создать классы для композитный материал и сопоставлять многоточие, один со свойством-исх

<component name="compIdProperty" unique="true"> 
     <property column="naselje" /> 
     <many-to-one column="korisnik" class="Korisnik"/> 
    </component> 

    <many-to-one name="Naselja" property-ref="compIdProperty"> 
     <column name="naselje" /> 
     <column name="korisnik" /> 
    </many-to-one> 

2) AFAIK это не возможно вообще, используя спящий режим

единственно возможный путь я вижу это на карте (Град, Opcina) в качестве свойств и управления Ассоциации себе

3) так как это унаследованная схема, я бы пошел на компромисс с добавлением много-к-одному, а также сопоставил много-к-одному с Korisnik в Opcine и Gradovi.

+0

Итак, если я управляю ассоциациями вручную таким образом, есть ли какие-либо Hibernate gotchas, о которых я должен знать? – Vedran

+0

о том, что Hibernate не знает, он не может вмешиваться. – Firo

+0

Теперь я обнаружил, что все выборки вынуждены стремиться при отображении таким образом; Любой способ избежать такого поведения? – Vedran