2011-12-26 13 views
9

Sto provando ad installare la mia applicazione di ibernazione per mantenere una nuova entità Notification ogni volta che viene creata un'entità Activity - al momento, tutto ciò che ho provato lo Notification non riesce a persistere silenziosamente (nessun errore nei registri ma SQL non viene mai eseguito) .È possibile mantenere nuove entità in un listener @ Pre/PostPersist?

Qualcuno può confermare che è persino possibile mantenere ulteriori entità negli ascoltatori di Hibernate pre/postPersist?

Ho letto nella documentazione:

un metodo di callback non deve richiamare i metodi EntityManager o query!

Ma ho letto diversi altri thread di discussione che sembrano indicare che è possibile.

Per riferimento, i due approcci ho cercato sono:

  1. @PrePersist metodo - la fissazione di un rapporto tra il cascade.ALL Activity e Notification, e nel metodo PrePersist semplicemente creando un nuovo Notification e collegandolo a Activity viene creato nella speranza che il Notification venga mantenuto.

  2. @PostPersist metodo - utilizzando @Configurable e ListenerClass, cablaggio in un servizio e la creazione di una nuova entità Notification e quindi chiamando esplicitamente l'entityManger persistono

Qualcuno può confermare quello che sto cercando è possibile?

risposta

1

Perché è necessario mantenere la funzione Notification nella funzione @PrePersist o @PostPersist? Il seguente codice dovrebbe persistere entrambe le entità:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     act.setNotification(new Notification()); 
     em.persist(act); 
    } 
} 

UPDATE: si può provare a creare il link all'interno costruttore di attività in questo modo:

@Entity 
public class Activity implements Serializable { 
    @OneToOne(cascade={CascadeType.PERSIST}) 
    private Notification notification; 

    public Activity() { 
     this.notification = new Notification(); 
    } 
} 

@Entity 
public class Notification implements Serializable { } 

@Stateless 
public class MrBean implements MrBeanInterface { 
    @PersistenceContext() 
    private EntityManager em; 

    public void persistActivity() { 
     Activity act = new Activity(); 
     em.persist(act); 
    } 
} 

Una cosa da notare è che penso che non si può usare @PostPersist. Per essere più precisi, è necessario collegare Notification a Activity prima di persistere Activity in modo che cascade={CascadeType.PERSIST} funzioni.

+0

Grazie - Ho bisogno di aggiungere la notifica nel metodo pre/postPersist perché voglio essere sicuro che ogni volta che viene creata un'attività, viene creata anche una notifica corrispondente. Se si considera che la Notifica sia un oggetto di controllo che deve essere garantito, con la prima soluzione c'è il rischio che qualcuno possa chiamare em.persist (act); da qualsiasi altra parte della codebase (una classe batch/operativa o qualsiasi altra classe di servizio) e a meno che non aggiungano anche il codice di notifica, non otteniamo la nostra verifica. La seconda soluzione è quella che ho provato per il mio approccio 1) nel post originale ma sta fallendo silenziosamente. – rhinds

+0

@rhinds Ho appena aggiornato la mia risposta. Puoi creare il link nel costruttore di Activity. –

+0

grazie, ci proverò - anche se sembra ancora che non sarebbe l'ideale come sarebbe ancora aperto per il montaggio prima di persistere. Sembra che pre-persistere dovrebbe essere il posto giusto per fare questo tipo di operazione, ad esempio, abbiamo usato in precedenza il metodo prePersist per impostare le date modificate di tutti gli oggetti, e significava che la data di modifica non poteva mai essere cambiata manualmente o sostituita – rhinds

2

È possibile mantenere ulteriori entità in Hibernate listener di eventi (inserimento, aggiornamento, flush, ecc.) Con l'interfaccia StatelessSession. Ma non so se questo è possibile anche con un codice solo JPA (EntityManagerFactory e EntityManager).

+0

Sì, è specifico per l'implementazione, ma Hibernate ed EclipseLink hanno qualcosa di analogo. – wrschneider

+0

Grazie - è appropriato per il persistere del runtime? Ho notato che i documenti si riferiscono ad esso come un'interfaccia di operazione batch e non utilizza alcun caching di primo/secondo livello .. – rhinds

Problemi correlati