2014-10-23 7 views
0

우리는 도메인 클래스에서 검색을 수행하려는 컨트롤러가 있습니다. 실제 검색 로직은 서비스에서 처리됩니다. 이 검색에는 SomeDomain.withCriteria, fetchModeSELECTcreateAlias으로 설정해야합니다. 검색 결과가 제대로 표시됩니다. 결과가 나오면 동일한 컨트롤러에서 결과를 처리하는 다른 작업으로 리디렉션됩니다. 컨트롤러에서 반환하는 세션을 플러시하고 컨트롤러는 다음과 같은 예외가 발생하는 곳은 다음과 같습니다모든 일시적인 객체 얻기

객체가 저장되지 않은 과도 인스턴스를 참조 -

를 세척하기 전에 과도 인스턴스를 저장를 잘 나타나는으로 어떻게 든하고 우리 코드의 어딘가에 도메인 객체가 생성되어 저장되지 않습니다. 오류 메시지는 일시적인 객체의 유형을 표시 할만큼 친절하지만 언제 어디에서 작성되었는지 알리지 않습니다. 이것은이 객체가 어디서 만들어 졌는지, 그리고 지금이 객체에 대한 참조를 얻는 방법을 찾고 있다는 신비로 남아 있습니다. 그래서 여기 내 질문은 과도 상태에있는 모든 객체를 찾을 수 있다는 것입니다.

는 내가 그것에 discard를 호출하고 일을 거기에서 이동하는 방법을보고 싶어해서이 신비 저장되지 않은 객체의 참조를합니다. 나는이 객체가 필요 없다는 것을 알고 있으므로, 어딘가에 매달려 있다면 그것을 버려서 예외를 던지면서 끝나지 않도록하고 싶다. 누군가 왜 그 물체가 왜 그리고 왜 생성되는지를 알아낼 수 있다면 그것은 좋을 것입니다.

답변

1

우리도이 문제를 했어, 그리고 그것을 찾기 위해 불쾌한 버그가 있습니다. 아마도 Hibernate의 내부 구조를 따라 가면서 모든 과도 상태를 찾을 수는 있을지 모르겠지만, 나는 결코 그것으로 멀리 가지 않았다. 대신, 우리는 일반적으로 flush() 및 2 진 검색을 통해 디버그합니다. 어떤 작업이 객체 그래프에 과도기를 도입했는지 분명해질 때까지 세션을 점점 더 많이 플러시합니다.

+0

저는 부탁합니다. 무언가 과학, 부분 과학 –

+1

@BurtBeckwith 과학에서 우리는 첫 번째 원칙으로부터 답을 추론 할만큼 충분히 똑똑하지 않기 때문에 실험을합니다. –

+0

어디서나 save를 호출하지 않으므로 save (flush : true)를 사용할 수 없습니다. 이것 이외에 나는 어떤 물체에 대해 내가 플러시라고 부르기를 원하지 않는지 이해하지 못합니까? 그것이 최대 절전 모드 세션이라면 그 객체에서 그런 메소드를 찾을 수 없다. 그것은 또한뿐만 아니라 HTTP 세션에서 메서드가 무엇입니까? – sttaq