| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Hibernate+Anotation+Spring |
| Автор: baracuda25 23.4.2010, 07:03 | ||||||||||||||||
| Здраствуйте) Работаю с 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 23.4.2010, 07:52 |
| 1. Emploee -> Employee 2. Попробуй после сохранения этот объект Evict |
| Автор: baracuda25 23.4.2010, 08:21 | ||||
| Эммм....Первое исправил А вот второе не помогло....Я уже когда то пробывал такое((( У меня есть сомнения на счет CascadeType....может в эту сторону двигатся? Вот собственно текст консоли с ошибками
А вот так срабатывает merge()
тоесть оно тупо дублирует записи....но как не странно их в базе нету))) Но когда дело и касается всего приложения дак начинаются такие чудеса что хочется бится головой об стенку |
| Автор: dobrolub 23.4.2010, 08:45 |
| ugh, с детства не люблю хай-бер-нэйт. Ну в приципе такая ошибка возникает тогда, когда пытаешься сохранить Объкт который в ХБ уже загружен. ХБ находит объект по id и если он загружен, но obj1 != obj2 ( по понятиям Java...) кидается exception... Сволочи, короче. Я не в курсе использует ли он equals или == тут надо пробовать. Сделай своим объектам правильный equals, может это поможет. А если нет, то надо разбираться как и почему получилось в памяти два объекта с одним и тем-же id. ah, equals там уже есть... только он такой навороченный. Зачем такой? Это правильно? |
| Автор: baracuda25 23.4.2010, 15:32 | ||||
| Ну equals я сгенерировал с помощью IDEA))) Я бы конечно по проще сделал)) Блин ну такой тупняк, вроди пустышное дело взять с базы двух типов провести тразакцию и все, а сколько гемора...бррр.... Попробую чето еще погуглить, если кто надумает что-нибудь дак пишите, не стесняйтесь))) dobrolub спасибо что проявил инициативу Добавлено через 8 минут и 44 секунды А вот на счет как получилось два обьекта то я думаю что это все из-за того что
а в методе getItembyId();
Тоесть я делаю ссылку на другой, тоже самое и с Customer.... Но как же без этого обойтись? В тупую копировать все поля, а потом удалять тот обьект что подгрузил?! Как то туповато, да и зачем тогда это Hibernate? Лучше в тупую jdbc юзать |
| Автор: dobrolub 23.4.2010, 18:11 |
| на Open JPA нельзя его заменить? (Я ни то, ни другое не использую, а для mappinga у меня простая библиотека написана: www.jdbcpersistence.org) Собственно, я и написал её потому что не смог справиться с hibernate. С тех пор я не люблю и его создателя, мистера Кинга. |
| Автор: baracuda25 23.4.2010, 22:00 |
| Как вариант можно попробовать.... На сколько я знаю сходсвтво Hibernate c анотациями и JPA очень большое,так что может чето и получится))) |
| Автор: MaxPayneC 24.4.2010, 19:47 |
| Попробуйте организовать работу с сущностями так, чтобы не возникало ситуаций одновременного присутствия двух объектов с одним ид и разным состоянием. Например, я писал фильтр, который открывает/закрывает сессию хибернейт и транзакцию при запросах к веб-серверу (контейнеру сервлетов), правда у меня был стратс, а не спринг, не уверен насколько этот метод подойдет вам и не сделано ли уже это за вас. |
| Автор: sergiusmetallicus 25.4.2010, 23:37 | ||
... У меня была когда-то похожая проблема (different object with the same iden....) во время entity update. Все решилось вызовом метода Session.clear() перед сохранением:
в таком случае все работает. |
| Автор: baracuda25 26.4.2010, 13:28 |
| Ребята в общем все испытал....Максимум чего добился дак это с помощью merge() дублирование записей при чем с геометрической прогрессией Добавлено через 1 минуту и 9 секунд вот мое мыло baracuda25@gmail.com. Буду рад любой информации!!! |
| Автор: baracuda25 26.4.2010, 16:18 | ||||||
В общем только что убрал СascadeType.ALL на СascadeType.MERGE и CAscadeType.PERSISt в обьекте Order и программа начала работать без Exception, но только на удивление странно вот первый вызов:
Вот второй:
А вот и самый интересный:
У кого есть какие идеи на счет этого феномена?) |
| Автор: baracuda25 29.4.2010, 16:37 |
| В общем, кому интересно, дак проблема решилась тем что я убрал двустороннюю связь...Чего то Hibernate не очень хочет с ними коректно рабоать, решил вместо этой связи делать запросы ручка, конечно это не соотведствует ORM, но другого выхода я так и не нашел! Думаю эту тему можно считать закрытой... Всем спасибо за помощь! |