![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
baracuda25 |
|
||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
Здраствуйте) Работаю с Hibernate 3.5+Spring.... Моя проблема такова "different object with the same identifier value was already associated with the session" ..... Есть проект десктопный в котором только один Hibernate и вот решил написать WEB, но что в том и в том выскакивает даная ошибка! Боролся разными способами но максимум чего добился так это дублирование записей и багов в проге.... В общем покажу не на словах а на деле.
Краткое вступление: Имееться несколько класов Enity и cоотведственно EnityDAO, которые в свою очередь задеплоины в Service. Emploee
Order
Product
Customer
Ну и из наследников Emploee
Вот его сервис в которого задеплоины с помощью Springa EnityDAO(не судите грубо, это тестовый варинт) SellerService
Все DAO наследуют HibernateDaoSupport и мой интерфейс вот один з DAO на котором выскакивает ошибка OrderDAO
Ну и собственно маленький тестик в результате чего все и происходит
Прога валится при втором запуске с выше указаной ошибкой!!! Перепробовал кажется все начиная от getHibernateTemplate.merge() и заканчивая close() , но ничего не привело к успеху....Я понимаю из-за чего она, я просто беру обьект из базы потом делаю ссылку на дургой обьект а потом сохраняю первый а второй гуляет в кеше дальше и естественно потом этот другой накапливается при каждом запуске, но вот как с этим боротся не понимаю!!!Помогите пожалуйста...Уже два дня убил на эту казалось детскую проблему и всеравно не могу решить!!! Буду очень признателен за помощь!!! |
||||||||||||||||
|
|||||||||||||||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 4 Всего: 16 |
1. Emploee -> Employee
2. Попробуй после сохранения этот объект Evict |
|||
|
||||
baracuda25 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
Эммм....Первое исправил
![]() А вот второе не помогло....Я уже когда то пробывал такое((( У меня есть сомнения на счет CascadeType....может в эту сторону двигатся? Вот собственно текст консоли с ошибками
А вот так срабатывает merge()
тоесть оно тупо дублирует записи....но как не странно их в базе нету))) Но когда дело и касается всего приложения дак начинаются такие чудеса что хочется бится головой об стенку ![]() |
||||
|
|||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 4 Всего: 16 |
ugh, с детства не люблю хай-бер-нэйт.
Ну в приципе такая ошибка возникает тогда, когда пытаешься сохранить Объкт который в ХБ уже загружен. ХБ находит объект по id и если он загружен, но obj1 != obj2 ( по понятиям Java...) кидается exception... Сволочи, короче. Я не в курсе использует ли он equals или == тут надо пробовать. Сделай своим объектам правильный equals, может это поможет. А если нет, то надо разбираться как и почему получилось в памяти два объекта с одним и тем-же id. ah, equals там уже есть... только он такой навороченный. Зачем такой? Это правильно? Это сообщение отредактировал(а) dobrolub - 23.4.2010, 09:10 |
|||
|
||||
baracuda25 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
Ну equals я сгенерировал с помощью IDEA))) Я бы конечно по проще сделал)) Блин ну такой тупняк, вроди пустышное дело взять с базы двух типов провести тразакцию и все, а сколько гемора...бррр.... Попробую чето еще погуглить, если кто надумает что-нибудь дак пишите, не стесняйтесь))) dobrolub спасибо что проявил инициативу
![]() Добавлено через 8 минут и 44 секунды А вот на счет как получилось два обьекта то я думаю что это все из-за того что
а в методе getItembyId();
Тоесть я делаю ссылку на другой, тоже самое и с Customer.... Но как же без этого обойтись? В тупую копировать все поля, а потом удалять тот обьект что подгрузил?! Как то туповато, да и зачем тогда это Hibernate? Лучше в тупую jdbc юзать |
||||
|
|||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 4 Всего: 16 |
на Open JPA нельзя его заменить?
(Я ни то, ни другое не использую, а для mappinga у меня простая библиотека написана: www.jdbcpersistence.org) Собственно, я и написал её потому что не смог справиться с hibernate. С тех пор я не люблю и его создателя, мистера Кинга. Это сообщение отредактировал(а) dobrolub - 23.4.2010, 18:48 |
|||
|
||||
baracuda25 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
Как вариант можно попробовать.... На сколько я знаю сходсвтво Hibernate c анотациями и JPA очень большое,так что может чето и получится)))
|
|||
|
||||
MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: 3 Всего: 9 |
Попробуйте организовать работу с сущностями так, чтобы не возникало ситуаций одновременного присутствия двух объектов с одним ид и разным состоянием. Например, я писал фильтр, который открывает/закрывает сессию хибернейт и транзакцию при запросах к веб-серверу (контейнеру сервлетов), правда у меня был стратс, а не спринг, не уверен насколько этот метод подойдет вам и не сделано ли уже это за вас.
|
|||
|
||||
sergiusmetallicus |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 25.4.2010 Репутация: нет Всего: нет |
... У меня была когда-то похожая проблема (different object with the same iden....) во время entity update. Все решилось вызовом метода Session.clear() перед сохранением:
в таком случае все работает. |
|||
|
||||
baracuda25 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
Ребята в общем все испытал....Максимум чего добился дак это с помощью merge() дублирование записей при чем с геометрической прогрессией
![]() Добавлено через 1 минуту и 9 секунд вот мое мыло [email protected]. Буду рад любой информации!!! |
|||
|
||||
baracuda25 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
В общем только что убрал СascadeType.ALL на СascadeType.MERGE и CAscadeType.PERSISt в обьекте Order и программа начала работать без Exception, но только на удивление странно вот первый вызов:
Вот второй:
А вот и самый интересный:
У кого есть какие идеи на счет этого феномена?) Это сообщение отредактировал(а) baracuda25 - 26.4.2010, 16:18 |
||||||
|
|||||||
baracuda25 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.4.2010 Репутация: нет Всего: нет |
В общем, кому интересно, дак проблема решилась тем что я убрал двустороннюю связь...Чего то Hibernate не очень хочет с ними коректно рабоать, решил вместо этой связи делать запросы ручка, конечно это не соотведствует ORM, но другого выхода я так и не нашел! Думаю эту тему можно считать закрытой... Всем спасибо за помощь!
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |