2013-02-28 10 views
6

Mam klasy JPA @Entity, który używa @PrePersist już od jakiegoś czasu. Dzisiaj chciałem dodać funkcjonalność, w której potrzebuję identyfikatora tego obiektu. Ten identyfikator jest generowany podczas utrzymywania przez HIBERNATE_SEQUENCE w bazie danych. Zwykle jest ustawiony po em.persist (entity).@PostPersist nie nazywane ... @PrePersist to ... dlaczego?

Z jakiegoś nieznanego powodu @PrePersist metoda jest wyzwalany ... podczas @PostPersist po prostu nie odpala:

@Entity 
public class MyEntity { 

    @PrePersist 
    protected void onCreate() { 
     System.out.println("ExtendedEntity.onCreate()"); 
    } 

    @PostPersist 
    protected void afterCreate() { 
     System.out.println("ExtendedEntity.afterCreate()"); 
    } 
} 

Używam środowiska V4.2 JBoss z v7 Java +, Hibernate v3.3.1.GA i Seam v2.2.2.Final ...

Czy są jakieś ukryte wymagania dotyczące @PostPersist?

+0

Myślenie głośno ... czy org.hibernate.event.PostInsertEventListener koliduje z JPA? –

+1

To zakłóca ... zobacz moją odpowiedź. –

Odpowiedz

8

Dla każdego innego ... hibernacji detektory zdarzeń wydaje się kolidować z WZP wydarzeń utrwalania ... po usunięciu następujące wiersze z mojego persistence.xml callback @PostPersist jest uruchomiony.

<property name="hibernate.ejb.event.pre-insert" value="my.hibernate.events.listeners.Listener" /> 
<property name="hibernate.ejb.event.pre-update" value="my.hibernate.events.listeners.Listener" /> 
<property name="hibernate.ejb.event.pre-delete" value="my.hibernate.events.listeners.Listener" /> 
<property name="hibernate.ejb.event.post-insert" value="my.hibernate.events.listeners.Listener" /> 
<property name="hibernate.ejb.event.post-update" value="my.hibernate.events.listeners.Listener" /> 
<property name="hibernate.ejb.event.post-delete" value="my.hibernate.events.listeners.Listener" /> 

Już ich nie używamy ... nigdy nie zostały całkowicie wyłączone.

+0

Dla potomności, to dlatego, że Hibernate faktycznie realizuje swoje wywołania zwrotne WZP za pośrednictwem swoich odbiorców. Więc zamiast przesadnie pisać słuchaczy, chciałbyś mieć pewność, że dodasz słuchaczy; w ten sposób oba mogą współistnieć (słuchacze na typ są ułożone w stos). –

+0

Tak więc moje ustawienia wyłączone własne słuchacze Hibernate są używane do callbacków WZP? Pamiętaj ... @PrePersist nadal pracował z powyższymi wpisami. Połączenia zwrotne JPA powinny działać niezależnie od tego, czy używam tych ustawień, czy nie. –

+1

Być może. Nie zgadzam się. Po prostu wyjaśniając, co się stało. Otrzymaliśmy zero żądań ulepszeń, aby umożliwić działanie wywołań zwrotnych JPA i detektorów zdarzeń Hibernate. Ale tak być może, tak naprawdę mogą, po prostu nie używając tej opartej na XML metody konfiguracji odbiornika (która i tak jest przestarzała). –

0

Wierzę, że zostanie wywołany podczas zatwierdzania lub koloru. Czy wyraźnie dzwonisz do któregoś z tych? Zastanawiam się, może jest pewne opóźnienie od momentu, w którym podmiot zarządzający faktycznie utrzymuje się w bazie danych. Na przykład transakcje mogą zostać zatwierdzone dopiero po zapisaniu odpowiedzi (w aplikacjach internetowych).

Spróbuj także użyć rejestratora, dziwne rzeczy mogą się zdarzyć podczas wywoływania standardowego połączenia z aplikacji internetowych.

+0

STDOUT był tylko tymczasowy ... Używam normalnie Log4J. Spłukiwanie ręczne() niczego nie zmieniło ... zobacz moją odpowiedź. –

+0

Miło ... nie wspominałeś, że w swoim pytaniu masz skonfigurowane detektory zdarzeń hibernacji. –

+0

Też o nich nie myślę ... Nie korzystałem z nich przez długi czas, ale utrzymywałem konfigurację prostej klasy loggera. –

Powiązane problemy