Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / как пофикстить org.hibernate.NonUniqueObjectException ? / 25 сообщений из 35, страница 1 из 2
09.09.2013, 13:28:33
    #38390923
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
Есть такой эксепшн
Код: java
1.
2.
hrew exception [Request processing failed; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.epam.hhsystem.model.vacancy.Vacancy#6]] with root cause
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.epam.hhsystem.model.vacancy.Vacancy#6]



Я так понимаю, что вакансия с id=6 дважды ассоциирована с объектом в бд и хибер не понимает какой из них правильный.
Но я ума не приложу где это могло случиться. Как посоветуете искать баг?
...
Рейтинг: 0 / 0
09.09.2013, 13:41:13
    #38390934
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90,
- транзакции как можно короче и равны http сессии.
- время объекта не дольше самой сессии.
Тогда подобная ошибка вылезет на этапе появления.
...
Рейтинг: 0 / 0
09.09.2013, 13:59:01
    #38390957
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
Обычно бывает при неправильной работе с коллекциями много-ко-многим. Возможно, станет понятнее из исходного кода, работающего с Vacancy
...
Рейтинг: 0 / 0
09.09.2013, 18:57:31
    #38391424
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
до сих пор голову ломаю.

Вот так замаплено:
в Vacancy:
Код: java
1.
2.
3.
4.
@ManyToMany(mappedBy = "vacancies", fetch = FetchType.EAGER)
	public Set<Event> getEvents() {
		return events;
	}


в Event:
Код: java
1.
2.
3.
4.
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	public Set<Vacancy> getVacancies() {
		return vacancies;
	}



метод, который вызывается:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@RequestMapping(value = "/updateEvent", method = RequestMethod.POST)
	public String updateEvent(Model model,
							 @Valid @ModelAttribute("existedEvent") Event event,
							 BindingResult result,
							 @ModelAttribute("linkedCandidates")Set<Candidate> candidates,
							 @ModelAttribute("linkedvacancies")Set<Vacancy> vacancies)
	{
		if(result.hasErrors()){
			model.addAttribute("idEvent",event.getId());
			return "eventDetails";
		}
		for(Vacancy vacancy:vacancies){
			vacancy.getEvents().add(event);
		}
		event.setVacancies(vacancies);

		eventService.update(event);
		return "redirect:goToEventMenu";
		
	}
	
}



летим в update
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Transactional
@Service
public class EventService {
     public void update(Event event) {
		eventDao.update(event);
	}
....
}



теперь идём в дао
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
@Repository("eventDaoImpl")
public class EventDaoImpl extends DaoAbstract implements EventDao {
	@Autowired
	CandidateDao candidateDao;
	
	@Autowired
	VacancyDao  vacancyDao;
	


	@Override
	public boolean update(Event event) {
		Session session = sessionFactory.getCurrentSession();
		if (event == null) {
			return false;
		}
		session.update(event);
		return true;
	}
...
}












}
...
Рейтинг: 0 / 0
09.09.2013, 19:02:00
    #38391430
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
Petro123- транзакции как можно короче и равны http сессии.

у меня на один http запрос открывается несколько транзакций
Petro123- время объекта не дольше самой сессии.

про какую сессию тут?
...
Рейтинг: 0 / 0
09.09.2013, 19:54:06
    #38391469
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90у меня на один http запрос открывается несколько транзакций


Зачем?
...
Рейтинг: 0 / 0
09.09.2013, 20:11:19
    #38391479
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
забыл ник,

разговор утечет не в ту сторону...я думаю это не важно.

я пофиксил эту ошибку :в Event убрал каскад:
Код: java
1.
2.
3.
4.
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	public Set<Vacancy> getVacancies() {
		return vacancies;
	} 


так стало:
Код: java
1.
2.
3.
4.
@ManyToMany( fetch = FetchType.EAGER)
	public Set<Vacancy> getVacancies() {
		return vacancies;
	} 



Но я всё равно не понимаю почему так произошло.

Кто нибудь понял что случилось?
...
Рейтинг: 0 / 0
09.09.2013, 20:26:45
    #38391488
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90разговор утечет не в ту сторону...я думаю это не важно.


Согласен, это оффтоп, но уж больно мне интересно, ни разу такого не видел. Ну точнее видел когда одна транзакция на апдейт\делете\инсерт, а потом вторая транзакция рид-онли для отрисовки страницы в Seam, но чтоб самому юзать несколько транзакций - интересненько
...
Рейтинг: 0 / 0
09.09.2013, 20:39:40
    #38391495
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90Я так понимаю, что вакансия с id=6 дважды ассоциирована с объектом в бд

При чем тут "в бд". Просто два экзеимпляра одного и того же класса с одним id.

redwhite90и хибер не понимает какой из них правильный.
Он не разбирается. Он просто запрещает комит такой сессии.

redwhite90Но я ума не приложу где это могло случиться. Как посоветуете искать баг?
Можно в хибере подебажить там же где выкидывается исключение, увидеть две сущности.
Чтобы увидеть откуда они появились, нужно поставить брейкопоинт там где они регистрируются в сессии. Тоже просто найти, это не далеко от места где выкидывается исключение.
...
Рейтинг: 0 / 0
09.09.2013, 21:49:00
    #38391530
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
забыл никredwhite90у меня на один http запрос открывается несколько транзакций


Зачем?
может это и неправильно, но как есть:
Возьмем метод обновления event-а:
1 транзакция - получить event, который меняем
2 - получить новые вакансии, которые надо приаттачить
3- новые кандидаты
4 - сохранить измененный event

за каждый пункт отвечает метод из какого-либо сервисного класса.

Каждый сервыисный класс помечен @Transactional

Хотя наверное Вы просто меня как-то не так поняли.
...
Рейтинг: 0 / 0
09.09.2013, 21:57:40
    #38391538
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
BlazkowiczПри чем тут "в бд". Просто два экзеимпляра одного и того же класса с одним id.

В сессии hibernate? Я что-то наверное не так понимаю. Я в 1 сессии беру меняемый event и закрываю сессию ,также поступаю с вакансиями и кандидатами для этого event-a, Теперь они у меня все detached, я их комбинирую как мне надо, жмакаю update для объекта event и вижу ексепшен.
BlazkowiczОн не разбирается. Он просто запрещает комит такой сессии.

Можете пожалуйста полностью сформулировать свою мысль?
BlazkowiczМожно в хибере подебажить там же где выкидывается исключение, увидеть две сущности.
Чтобы увидеть откуда они появились, нужно поставить брейкопоинт там где они регистрируются в сессии. Тоже просто найти, это не далеко от места где выкидывается исключение.
По каким признакам можно идентифицировать место регистрации в сессии?
...
Рейтинг: 0 / 0
09.09.2013, 23:06:11
    #38391578
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90Теперь они у меня все detached
что сложного?
- либо не отсоединяй от хибера-БД-сессии
- либо корректно и геморройно присоединяй обратно....поиск....
...
Рейтинг: 0 / 0
09.09.2013, 23:16:55
    #38391585
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
Petro123redwhite90Теперь они у меня все detached
что сложного?
- либо не отсоединяй от хибера-БД-сессии
- либо корректно и геморройно присоединяй обратно....поиск....
проблема в том, что я не понимаю в чем ошибка была.

все 3 сущности(кандидат, вакансия, событие) связаны между собой отношением многие ко многим. Ну и видимо это как-то влияет на ситуацию.

Я просто хочу докопаться до сути и понять
1.почему так произошло. В чем реальная причина.
2.Почему это пофиксилось убиранием каскада.

Ну и собственно ответы на эти вопросы помогут мне не повторить этого в будущем.
...
Рейтинг: 0 / 0
09.09.2013, 23:17:50
    #38391586
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
автор- либо корректно и геморройно присоединяй обратно....поиск....

По какому принципу необходимо это делать?
...
Рейтинг: 0 / 0
09.09.2013, 23:20:36
    #38391587
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
автор- либо не отсоединяй от хибера-БД-сессии
то есть предлагаете сделать на уровне cервиса(который будет помечен @Transactional) метод, в котором будет инкапсулирована вся логика работы с БД?
...
Рейтинг: 0 / 0
10.09.2013, 09:48:36
    #38391754
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90,
- логика не с бд а с объектами Предметной области т.е. БЛ.
- да. Все сделать за один вызов Http.
- много ко многим по БЛ всегда каскад в одну сторону. Т.е. справочники не стираются
...
Рейтинг: 0 / 0
10.09.2013, 09:50:29
    #38391758
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
Чтобы докопаться сделай минимальный тест
...
Рейтинг: 0 / 0
10.09.2013, 10:30:27
    #38391810
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90,
в случае CascadeType.ALL перед обновлением коллекции необходимо происоединить к сессии ее хозяина. То есть в данном случае алгоритм такой:
Код: java
1.
2.
3.
4.
5.
event = session.merge(event); // присоединили хозяина
//... обновляем коллекцию
event.setVacancies(vacancies);
// сохраняем коллекцию
session.update(event);


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

В данном же случае хозяин не был предварительно присоединен, я предполагаю, что при вызове session.update(event) получилось следующее:
- состояние объекта event было синхронизировано с базой; это значит: было произведено обновление в таблице event и присоединение "предыдущей" коллекции vacancies (fetch = FetchType.EAGER). Итак, стостояние на первом этапе {event:attached; event.vacancies_old:attached; event.vacancies_new:detached}
- поскольку для коллекции vacancies указано каскадное обновление (cascade = CascadeType.ALL), hibernate начал сохранять "новую" (пока что detached) коллекцию, но обнаружил в сессии attached элемениты "старой" коллекции. Отсюда и NonUniqueObjectException. Избежать этого исключения можно было бы только в случае, когда старая и новая коллекции не пересекаются, например, когда мы заполняем пустую коллекцию vacancies.

Не знаю, насколько эти объяснения правдоподобны, но у меня это работает. Если кратко, алгоритм при работе с каскадными коллекциями много-ко-многим такой:
- присоединить хозяина коллекции
- присоедить элементы новой коллекции, заменить коллекцию в хозяине
- сохранить хозяина

Ну, или просто не использовать каскадное обновление в связях many-to-one и many-to-many, как это и рекомендуется в документации
...
Рейтинг: 0 / 0
10.09.2013, 11:35:25
    #38391917
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
ivanra,

авторИзбежать этого исключения можно было бы только в случае, когда старая и новая коллекции не пересекаются, например, когда мы заполняем пустую коллекцию vacancies

Тоже такая первая мысль была, но это на самом деле не правдой оказалось. То есть у event не было приаттаченных вакансий и всё равно та же ошибка.
авторНу, или просто не использовать каскадное обновление в связях many-to-one и many-to-many, как это и рекомендуется в документации
Можете пояснить что меняется при добавлении каскадности?
Без каскадности он не будет обновлять вакансии что ли?
...
Рейтинг: 0 / 0
10.09.2013, 11:45:50
    #38391935
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
ivanraredwhite90,
в случае CascadeType.ALL перед обновлением коллекции необходимо происоединить к сессии ее хозяина. То есть в данном случае алгоритм такой:
Код: java
1.
2.
3.
4.
5.
event = session.merge(event); // присоединили хозяина
//... обновляем коллекцию
event.setVacancies(vacancies);
// сохраняем коллекцию
session.update(event);


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

В данном же случае хозяин не был предварительно присоединен, я предполагаю, что при вызове session.update(event) получилось следующее:
- состояние объекта event было синхронизировано с базой; это значит: было произведено обновление в таблице event и присоединение "предыдущей" коллекции vacancies (fetch = FetchType.EAGER). Итак, стостояние на первом этапе {event:attached; event.vacancies_old:attached; event.vacancies_new:detached}
- поскольку для коллекции vacancies указано каскадное обновление (cascade = CascadeType.ALL), hibernate начал сохранять "новую" (пока что detached) коллекцию, но обнаружил в сессии attached элемениты "старой" коллекции. Отсюда и NonUniqueObjectException. Избежать этого исключения можно было бы только в случае, когда старая и новая коллекции не пересекаются, например, когда мы заполняем пустую коллекцию vacancies.

Не знаю, насколько эти объяснения правдоподобны, но у меня это работает. Если кратко, алгоритм при работе с каскадными коллекциями много-ко-многим такой:
- присоединить хозяина коллекции
- присоедить элементы новой коллекции, заменить коллекцию в хозяине
- сохранить хозяина

Ну, или просто не использовать каскадное обновление в связях many-to-one и many-to-many, как это и рекомендуется в документации


Ну и вообще...Кандидаты у меня ещё есть, которые абсолютно симметричны вакансиям(многие ко многим к event и к вакансиям) и там замаплено с каскадом. и:
1.Если убрать только связь Vacancy и Event - работает
2.Если убрать только связь Candidate и Event - НЕ работает - та же ошибка
...
Рейтинг: 0 / 0
10.09.2013, 12:02:33
    #38391972
как пофикстить org.hibernate.NonUniqueObjectException ?
Blazkowicz Можно в хибере подебажить там же где выкидывается исключение, увидеть две сущности.
Чтобы увидеть откуда они появились, нужно поставить брейкопоинт там где они регистрируются в сессии. Тоже просто найти, это не далеко от места где выкидывается исключение.
вот трэйс:
автор10.09.2013 11:46:14 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/ui] threw exception [Request processing failed; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.epam.hhsystem.model.vacancy.Vacancy#6]] with root cause
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.epam.hhsystem.model.vacancy.Vacancy#6]
at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:697)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:296)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:241)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:735)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:727)
at org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:388)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:331)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:209)
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:418)
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:358)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:334)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:209)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:166)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:132)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:364)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:338)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:241)
at org.hibernate.event.internal.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireUpdate(SessionImpl.java:786)
at org.hibernate.internal.SessionImpl.update(SessionImpl.java:778)
at org.hibernate.internal.SessionImpl.update(SessionImpl.java:774)
at com.epam.hhsystem.jpa.EventDaoImpl.update(EventDaoImpl.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy38.update(Unknown Source)
at com.epam.hhsystem.services.EventService.update(EventService.java:24)
at com.epam.hhsystem.services.EventService$$FastClassByCGLIB$$3653e1b6.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
at com.epam.hhsystem.services.EventService$$EnhancerByCGLIB$$8266fd26.update(<generated>)
at com.epam.hhsystem.web.controllers.EventMenuController.updateEvent(EventMenuController.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)


Где искать? где брекпоинты ставить?
...
Рейтинг: 0 / 0
10.09.2013, 12:09:10
    #38391990
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90Ну и вообще...Кандидаты у меня ещё есть, которые абсолютно симметричны вакансиям(многие ко многим к event и к вакансиям) и там замаплено с каскадом. и:
1.Если убрать только связь Vacancy и Event - работает
2.Если убрать только связь Candidate и Event - НЕ работает - та же ошибка
Тут еще важно, кто в связях объявлен хозяином, а кто - обратной (инверсной) стороной. В случае Vacancy и Event хозяин связи - Event, все действия с коллекцией зависят от него. Если в паре Candidate и Event хозяин Candidate, то действия с коллекцией со стороны Event просто игнорируются. Покажите аннотации на эту связь.

А по каскадам - смотрите главу 11.11. Transitive persistence в документации (это по hibenate 3).
Если кратко, они управляют транзитивностью операции, какой именно - видно из названия: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH.
CascadeType.UPDATE - нету, но поскольку выбрано CascadeType.ALL, то, как сказано в документации, транзитивными становятся все операции, в том числе и update(). Ну а что случилось дальше, я уже объяснил.
Обычно, максимум что нужно для работы с many-to-many, это CascadeType.MERGE.
...
Рейтинг: 0 / 0
10.09.2013, 12:11:27
    #38391994
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
ivanraТут еще важно, кто в связях объявлен хозяином
+1
...
Рейтинг: 0 / 0
10.09.2013, 12:50:44
    #38392090
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
ivanra,

ivanra Если в паре Candidate и Event хозяин Candidate, то действия с коллекцией со стороны Event просто игнорируются. Покажите аннотации на эту связь.

всё симметрично с вакансией
в Event(хозяин видимо)
Код: java
1.
2.
3.
4.
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	public Set<Candidate> getCandidates() {
		return candidates;
	}


Candidate:
Код: java
1.
2.
3.
4.
@ManyToMany(mappedBy = "candidates", fetch = FetchType.EAGER)
	public Set<Event> getEvents() {
		return events;
	}



Ну и в паре Кандидат-Вакансия хозяин - Кандидат
...
Рейтинг: 0 / 0
10.09.2013, 13:26:13
    #38392146
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как пофикстить org.hibernate.NonUniqueObjectException ?
redwhite90Ну и в паре Кандидат-Вакансия хозяин - Кандидат
кстати если сменить хозяина, то работает и с каскадами.
Правда перестали кандидаты сохраняться(их вакансии). Но я думаю, что хибер как-то не полностью подхватил моё изменение. Просто у меня стоит параметр для изменения базы как update
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / как пофикстить org.hibernate.NonUniqueObjectException ? / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]