2014-01-15 2 views
0

У меня проблема с двунаправленным доступом через соединительную, которая работает в одном направлении, а не в другом. Мне пришлось анонимизировать определения, но, надеюсь, все существенное все еще существует. Сценарий:Двунаправленный доступ Hibernate и незаконный доступ к сборке погрузки

MASTER - это основная таблица, которая имеет взаимно однозначное сопоставление с двумя таблицами A_SECTION и B_SECTION, которые являются подразделами основной записи, и все три имеют общий идентификатор. Это существующая конфигурация, которая работала годами.

Я добавил таблицу TIA_TIB_SHARE, которая представляет собой многозначное соотношение между двумя строками в таблице MASTER - это связывает A_SECTION с одним с B_SECTION на другом. Обе отношения идентичны, насколько я могу судить, но при доступе от MASTER через A_SECTION к другому MASTER через совместные работы, если я получаю доступ к другой строке со стороны B_SECTION, я получаю ошибку «незаконный доступ к загрузке». Я пробовал реализовать ленивую загрузку без каких-либо успехов.

Может ли кто-нибудь дать какие-либо предложения относительно того, почему это работает в одном направлении, а не в другом, или какие шаги я могу предпринять, чтобы диагностировать это? Я извлек соответствующие биты файла сопоставления Hibernate ниже - все сопоставление находится в XML и не используются аннотации.

Заранее спасибо ...

<class name=”Master” table=”MASTER” where=”is_deleted=’N’”> 
<id name=”id” column=”ID” type=”long”> 
<generator class=”native” /> 
</id> 
<one-to-one name=”sectionA” class=”SectionA” /> 
<one-to-one name=”sectionB” class=”SectionB” /> 

</class> 
<class name=”SectionA” table=”A_SECTION” where=”is_deleted=’N’”> 
<id name=”id” column=”ID” type=”long”> 
<generator class=”native” /> 
</id> 
<one-to-one name=”master” class=”Master” 
constrained=”true” /> 
<set name=”shared” sort=”natural”> 
<key column=”TIA_ID” /> 
<one-to-many class=”Share” /> 
</set> 
</class> 

<class name=”SectionB” table=”B_SECTION” where=”is_deleted=’N’”> 
<id name=”id” column=”ID” type=”long”> 
<generator class=”native” /> 
</id> 
<one-to-one name=”master” class=”Master” 
constrained=”true” /> 
<set name=”sharing” sort=”natural”> 
<key column=”TIB_ID” /> 
<one-to-many class=”Share” /> 
</set> 
</class> 

<class name=”Share” table=”TIA_TIB_SHARE”> 
<id name=”id” column=”ID” type=”long”> 
<generator class=”native” /> 
</id> 
<many-to-one name=”sharingA” class=”SectionA” 
cascade=”all” update=”true” insert=”true” column=”TIA_ID” /> 
<many-to-one name=”sharedB” class=”SectionB” 
cascade=”all” update=”true” insert=”true” column=”TIB_ID” /> 
</class> 
+0

Проведя еще немного тестирования, выясняется, что ошибка возникает только в том случае, если множество множителей содержит более одной строки. Есть идеи? – boston1832

ответ

0

Это должно быть комментарий, но так как я не могу написать одно: У меня нет решения, но это может сделать отладку проще, если вы поставите not- found = "ignore" и какое-то соединение явно в определении «многие-ко-многим» (внешнее соединение может работать).

0

Проблема решена. Я наклеил сопоставления из существующего набора и не заметил, что я сохранил условие sort = «natural». Тем не менее, мои тестовые данные имели одну строку в множестве множителей для одного теста и две строки для другой. Набор одиночных строк работал, но набор нескольких строк не выполнялся, и это было разрешено путем реализации equals(), hashCode() и compareTo() в моем классе Share.

Hibernate не удалось создать экземпляр коллекции, потому что класс не был сопоставимым, но это не имело значения, когда была только одна строка. Я не уверен, почему Hibernate не хочет раскрывать это в трассировке стека и вместо этого возвращает исключение LazyInitialisationException.

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