Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate: many-to-many и вставка новых записей 
:(
    Опции темы
XEugene
Дата 7.2.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 1.1.2008

Репутация: 1
Всего: 2



Есть две таблицы User и Dictionary которые связаны, как многие ко многим.
В Dictionary кроме прочего хранятся роли пользователя. Для связи многие ко многим между ними есть таблица UserRole.
User.hbm.xml
Код

       <set
           name="roles"
            table="USER_ROLES"
            cascade="save-update"
            lazy="false"
            sort="unsorted"
        >

            <key
                column="USR_ID"
            />

            <many-to-many
                class="Dictionary"
                column="DIC_ROLE_ID"
                outer-join="auto"
             />
        </set>


UserRole.hbm.xml
Код

    <many-to-one
        name="user"
        class="User"
        not-null="true"
    >
        <meta attribute="field-description">
           @hibernate.many-to-one
            not-null="true"
           @hibernate.column name="USR_ID"         
        </meta>
        <column name="USR_ID" />
    </many-to-one>


Для коллекции ролей в классе User в маппинге указано каскадное сохранение(cascade="save-update"),
то есть при изменении коллекции ролей существующего User роли должны автоматически сохранятся в таблице UserRole.


Собственно проблема: при добавлении роли следующим образом
Код

 Dictionary dicRole = roleManager.getRole(roleName);
 user.getRoles().add(dicRole);


выбрасывется иксепшен
Код

Hibernate operation: could not insert collection rows: [ru.ppk.model.User.roles#7017]; SQL [insert into USER_ROLES (USR_ID, DIC_ROLE_ID) values (?, ?)]; ORA-01400: cannot insert NULL into ("PPK"."USER_ROLES"."URO_ID") ; nested exception is java.sql.SQLException: ORA-01400: cannot insert NULL into ("PPK"."USER_ROLES"."URO_ID") 

хотя в маппинге таблицы для генерации id выбрана стратегия native
Код

    <id
        name="uroId"
        type="java.lang.Long"
        column="URO_ID"
    >
    
        <meta attribute="field-description">
           @hibernate.id
            generator-class="native"
            type="java.lang.Long"
            column="URO_ID"

        </meta>
        <generator class="native" />
    </id>


То есть, если в двух словах, то суть проблемы в том, что Oracle не генерирует id для таблицы, в маппинге которой указан generator class="native".
Почему такое может происходить?
PM MAIL   Вверх
XEugene
Дата 9.2.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 1.1.2008

Репутация: 1
Всего: 2



Если сменить native на increment - та же ошибка. 

Вообще, меня сразу насторожил запрос, сгенерированный hibernate
Код

insert into USER_ROLES (USR_ID, DIC_ROLE_ID) values (?, ?)

Первичный ключ URO_ID, тот самый который вызывает ошибку, в запросе отсутствует. 
PM MAIL   Вверх
Llucas
Дата 10.2.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


J2EE Developer
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 29.11.2006
Где: Одесса

Репутация: нет
Всего: нет



давай полный mapping для этих трех таблиц... посмотрим... + помойму как то странно схема БД выглядит по твоему описанию.
PM MAIL WWW   Вверх
fixxer
Дата 10.2.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 4
Всего: 27



В Oracle нет типа данных identity/autoincrement. Для генерации уникальных значений используются SEQUENCE. Соответственно тип генератора в хибернейте следует использовать такой же.

Добавлено через 6 минут и 20 секунд
Да, native тоже должен сработать, единственное что, нужно указать имя sequence в параметрах генератора.


--------------------
user posted image
PM MAIL ICQ   Вверх
XEugene
Дата 11.2.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 1.1.2008

Репутация: 1
Всего: 2



Цитата(fixxer @  10.2.2009,  19:40 Найти цитируемый пост)
В Oracle нет типа данных identity/autoincrement. Для генерации уникальных значений используются SEQUENCE. Соответственно тип генератора в хибернейте следует использовать такой же.

Добавлено через 6 минут и 20 секунд
Да, native тоже должен сработать, единственное что, нужно указать имя sequence в параметрах генератора. 
native в Oracle у меня всегда работал и так.  Подозреваю, что без явного указания сиквенса,  hibernate сам создает его.  Сейчас попробовал указать в параметре существующий sequence.  Ничего не изменилось.

Насчёт стратегии increment, по-моему она не использует собственный autoincrement  базы данных(как в MySQL). 
Судя по тому, что написано в документации
Код

generates identifiers of type long, short or int that are unique only when no other process is inserting data into the same table. Do not use in a cluster.
 генерацию идентификатора здесь обеспечивает сам hibernate.  Трудно представить себе, чтобы мусуловский автоинкремент не справился с ситуацией, когда разные процессы пишут в одну таблицу.



PM MAIL   Вверх
XEugene
Дата 12.2.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 1.1.2008

Репутация: 1
Всего: 2



Цитата
Насчёт стратегии increment, по-моему она не использует собственный autoincrement  базы данных
Да, сейчас прочитал в Hibernate in Action про генератор increment подробнее.  Он генерирует идентификатор сам,  просто считывая максимальный и увеличивая его на единицу.  Он работает независимо от того, можно ли в данной субд создать автоинкрементное поле.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1064 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.