Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка) / 10 сообщений из 10, страница 1 из 1
01.05.2014, 20:15
    #38631034
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
Уже который день не могу понять почему вылетает следующая ошибка. Решения то есть, но как-то странно, перепробовал, и не работает. Даже нонсенс - на одном комп такая конфигурация работает на ура, на другом нет.

Суть: У одного объекта есть список с другими объектами. Хочу чтоб другой объект сохранял в себе ссылку на объект родителя. Нуу из аннотаций в теме все понятно.


Последовательность вызовов

Код: java
1.
2.
3.
4.
1.	@RequestMapping(value = "id/{participantId}/module/{module}/objective", method = RequestMethod.POST) - OK
2.	@RequestMapping(value = "id/{participantId}/module/{module}/objectives", method = RequestMethod.GET) - OK
3.	@RequestMapping(value = "id/{participantId}/module/{module}/objective/{objectiveId}/action", method = RequestMethod.POST) - OK
4.	@RequestMapping(value = "id/{participantId}/module/{module}/objectives", method = RequestMethod.GET) - ERROR



Вот как выглядят entities сейчас(Этот вариант прекрасно работает на одном комп, на другом нет).

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
@Entity
@Data
public class Objective implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "objective_id")
private Long id;

..............................


/**
* the actions of objective
*/
// @Cascade({CascadeType.ALL})
// @JsonManagedReference
// @JsonBackReference
// @JsonIgnore
@OneToMany(mappedBy = "objective", fetch = FetchType.EAGER, orphanRemoval = true)
private List<Action> actions;

}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
@Entity
@Data
public class Action {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

.......................

/**
* objective of this action
*/
//	@JsonBackReference
//	@JsonManagedReference
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "objective_id")
@JsonIgnore
private Objective objective;

}



Весь стек-трейс закинуть не могу(так как рекурсия), но вот часть.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WARN 2014-05-01 18:00:01,201 [1403671073@qtp-164700615-0] o.s.w.s.m.s.DefaultHandlerExceptionResolver 'Handling of [org.springframework.http.converter.HttpMessageNotWritableException] resulted in Exc
eption'
java.lang.IllegalStateException: Committed
at org.mortbay.jetty.Response.resetBuffer(Response.java:1023) ~[jetty-6.1.26.jar:6.1.26]
at org.mortbay.jetty.Response.sendError(Response.java:240) ~[jetty-6.1.26.jar:6.1.26]
at org.mortbay.jetty.Response.sendError(Response.java:342) ~[jetty-6.1.26.jar:6.1.26]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.sendServerError(DefaultHandlerExceptionResolver.java:309) ~[spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(DefaultHandlerExceptionResolver.java:366) ~[spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:139) ~[spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136) [spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1148) [spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:985) [spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) [spring-webmvc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
2014-05-01 18:00:01.204:WARN::/welldoo-tk-service-objective/id/13/module/RELAX/objectives
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError) (through reference chain: com.service.objective.domain.objec
tive.Objective["actions"]->org.hibernate.collection.internal.PersistentBag[0]->com.service.objective.domain.action.Action["objective"]->com.service.objective.domain.objective.Objec
tive["actions"]->org.hibernate.collection.internal.PersistentBag[0]->com.service.objective.domain.action.Action["objective"]->com.service.objective.domain.objective.Objective["acti
ons"]->org.hibernate.collection.internal.PersistentBag[0]
...
Рейтинг: 0 / 0
01.05.2014, 20:30
    #38631041
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
_webdev_,

Попробуйте заменить private на protected :
Код: java
1.
2.
3.
4.
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "objective_id")
@JsonIgnore
protected Objective objective;
...
Рейтинг: 0 / 0
01.05.2014, 20:48
    #38631050
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
Usman_webdev_,

Попробуйте заменить private на protected :
Код: java
1.
2.
3.
4.
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "objective_id")
@JsonIgnore
protected Objective objective;

- к сожалению не помогло - та же ошибка.
...
Рейтинг: 0 / 0
01.05.2014, 20:58
    #38631058
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
Можно попробовать с @JsonIgnoreProperties :
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity
@Data
@JsonIgnoreProperties({"objective"})
public class Action {
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "objective_id")
    @JsonIgnore
    public Objective objective;
}
...
Рейтинг: 0 / 0
01.05.2014, 21:15
    #38631072
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
Падает JSON а вопрос почему-то про Hibernate.
...
Рейтинг: 0 / 0
01.05.2014, 21:25
    #38631079
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
UsmanМожно попробовать с @JsonIgnoreProperties : - так же не работает, тем более, мне кажется поля в Entity должны быть приватными.

BlazkowiczПадает JSON а вопрос почему-то про Hibernate. - Но падает же при вытаскивании объекта. Не буду с Вами спорить, не компетентен. )))
Так сформулировалось. Буду благодарен за подсказку.
...
Рейтинг: 0 / 0
01.05.2014, 21:35
    #38631086
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
_webdev_,

@JsonIgnore может не работать на приватном поле.
В Jackson 1.6 есть другие аннотации для обратной ссылки.
http://stackoverflow.com/questions/9037955/spring-mvc-json-infinite-recursion
Ну, и вообще
https://www.google.com/search?q=Could not write JSON: Infinite recursion (StackOverflowError)
...
Рейтинг: 0 / 0
01.05.2014, 21:43
    #38631094
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
Blazkowicz_webdev_,

@JsonIgnore может не работать на приватном поле.
В Jackson 1.6 есть другие аннотации для обратной ссылки.
http://stackoverflow.com/questions/9037955/spring-mvc-json-infinite-recursion
Ну, и вообще
https://www.google.com/search?q=Could not write JSON: Infinite recursion (StackOverflowError)

Ну вы же заметили наверняка, что я пробовал различные варианты, и в гугла спрашивал. Вот например, сейчас поменял. Та же ошибка.


Код: java
1.
2.
3.
	 @JsonManagedReference
	@OneToMany(mappedBy = "objective", fetch = FetchType.EAGER, orphanRemoval = true)
	private List<Action> actions;



Код: java
1.
2.
3.
4.
	@JsonBackReference
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "objective_id")
	public Objective objective;
...
Рейтинг: 0 / 0
01.05.2014, 21:55
    #38631101
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
_webdev_,

На свойство поставьте.
...
Рейтинг: 0 / 0
01.05.2014, 22:35
    #38631122
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка)
Blazkowicz_webdev_,

На свойство поставьте. - хмммм, теперь вылетает ошибка сохранения Action.
Я почему-то начинаю дальше читать и предполагать, что я неправильно сохраняю.
Я сохраняю отдельно Каждую сущность, насколько теперь понимаю, сохранять я должен только родителя? Сейчас

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	public Objective createObjective(ObjectiveModel objectiveModel, long participantId, TkModule module) {

		Objective objective = new Objective();
		objective.setName(objectiveModel.getName());
		objective.setParticipantId(participantId);
		objective.setDateStart(objectiveModel.getDateStart());
		objective.setModule(module);

		objectiveRepository.save(objective);

		return objective;
	}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	public Action createAction(long participantId, TkModule module, long objectiveId, ActionModel actionModel) {

		Objective objective = objectiveRepository.findByParticipantIdAndModuleAndId(participantId, module, objectiveId);

		if (objective != null) {
			Action action = new Action();
			action.setObjective(objective);
			action.setName(actionModel.getName());
			action.setAmount(actionModel.getAmount());
			action.setDateStart(actionModel.getDateStart());
			if (actionModel.getDateEnd() != null) {
				action.setDateEnd(actionModel.getDateEnd());
			}
			action.setFrequencyFlag(actionModel.getFrequencyFlag());
			action.setDaysOfWeek(actionModel.getDaysOfWeek());

			actionRepository.save(action);

			return action;
		} else {
			throw new ServiceException("The action with this ID does not exist.", "objective.id.bad");
		}
	}



Никак не могу с этим разобраться...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: @OneToMany<->@ManyToOne - Рекурсия(Ошибка) / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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