2010-03-04 12 views
5

Mam obiekt domeny, który przechowuje wyniki obliczeń na podstawie parametrów, które są właściwościami tego samego obiektu domeny. Chciałbym się upewnić, że wszelkie parametry czasu zostaną zmienione przez użytkownika, przeliczą się i zostaną poprawnie zapisane w bazie danych.Modyfikowanie obiektu w AfterInsert/AfterUpdate

Próbuję to zrobić za pomocą funkcji afterInsert (w celu upewnienia się, że obliczenia są poprawne w pierwszej kolejności) i afterUpdate.

Jednak, ponieważ moje obliczenia próbują zmodyfikować sam obiekt, nie działa - rzucanie różnych wyjątków w trybie hibernacji.

Próbowałem umieścić kod AfterUpdate w transakcji, ale to nie pomogło. Obawiam się, że mam tutaj do czynienia z problemami zależności cyklicznej.

Wyjątkiem Dostaję teraz jest:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [esc.scorecard.PropertyScorecard#27] 

Są wydarzenia Gorm przeznaczone do prostszych przypadków użycia? Kusi mnie do wniosku, że modyfikacja obiektu, w którym jesteście w trakcie oszczędzania, nie jest drogą do zrobienia.

+0

co twoja obejście tego problemu. Stoję również w obliczu tego dylematu. * .withNewSession * nie działa dla afterInsert. Nie mogę opróżnić obiektu ani go po prostu zapisać (cóż, mogę .save(), ale wydaje się, że obliczenia, które zrobiłem wewnątrz funkcji afterInsert nie są zachowywane w bazie danych, jeśli po prostu użyję .save()). dzięki! W każdym razie chcę tylko zachować obiekt User w mojej klasie domeny (np. Message), który ją utworzył. Ponieważ dziennik inspekcji zapisuje tylko długi odnośnik (np. Utworzony przez), nie mogę ostatecznie manipulować klasą domeny Wiadomość i ostatecznie odwołać się do jej attrib –

Odpowiedz

2

Czy są jakieś powody, aby używać beforeInsert i beforeUpdate zamiast afterInsert i afterUpdate?

Jeśli nie, przejście do obsługi zdarzeń before* powinno rozwiązać twój problem

+1

Myślałem, że po uruchomieniu time afterUser, obiekt jest prawie utrwalony i ma id do tego punktu, ale mogę się mylić - cały proces uporczywości (z wydarzeniami) nie wydaje się być dobrze udokumentowany. –

+0

Rzeczywiście, jeśli twoje obliczenia używają właściwości 'id', może być problem z lokalizowaniem twojego kodu przed * handlerami. I nie wiem, które zdarzenie jest uruchamiane po wygenerowaniu identyfikatora. – fabien7474

3

Używasz 1.2.0+?

Jeśli tak, możesz użyć .withNewSession w zamknięciach zdarzeń, które mają zapobiegać hibernacji.

okrzyki

Lee

+0

tak, jestem na 1.2.1. Próbowałem używać zNewSession, ale to nie pomogło, powodując dziwne błędy hibernacji. –

Powiązane problemy