2012-11-25 8 views
9

Ho lavorato ai miei eventi JPA (postUpdate) e si stanno attivando correttamente quando aggiorno una proprietà sulla mia entità ad eccezione di quelli mappati come @ElementCollection.Qual è il trucco per far attivare i miei EventListeners per le proprietà @ElementCollection?

È una limitazione? Un'opzione di configurazione?

Ecco parte della mia entità

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Pckg { 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(nullable = false, length = 100) 
    private String title; 

    @ElementCollection 
    @CollectionTable (
     name = "PckDest", 
     joinColumns = @JoinColumn(name = "package_id", nullable = false) 
    ) 
    @Column(name = "destination", nullable = false, length = 150) 
    private List<String> destinations; 
    ... 

In altre parole, se cambio "titolo" Il cambiamento è catched dal mio ascoltatore, ma lo stesso non si verifica quando cambio "Destinazioni"

sto utilizzando JPA con Hibernate (4,0) come provider tramite molla (3.1)

Grazie

+0

Puoi essere più specifico per quando dici di _cambiare "destinazioni" _? Stai sostituendo la lista o modificando la lista? – pgreen2

+0

@ pgreen2 thx, quando ho detto _change_ intendevo in entrambi i casi, un elemento nell'elenco, ad esempio 'destinations.add (" LA ");' o semplicemente impostando un nuovo elenco, ad es. 'destinations = new ArrayList() ...' poi ho chiamato 'EntityManager.save (xx)'. Nessuno dei precedenti licenzia il mio 'onPostUpdate()', mentre eseguo 'Pckg.setTitle (" nuovo titolo ")' attiva correttamente il mio ascoltatore – maverick

+0

Ho dato una breve occhiata alle specifiche (http://download.oracle.com/ otndocs/jcp/persistence-2.0-fr-oth-JSpec /) e non mi viene in mente niente di sbagliato. Ho notato un paio di note su quando si verificano gli eventi. Potrebbero accadere quando si verifica la modifica o quando il cambiamento viene svuotato. Inoltre, la specifica non specifica cosa dovrebbe accadere se un'entità viene modificata e quindi rimossa, aggiunta e modificata. Non sembra che questi casi limite siano il tuo problema. Non ho una configurazione del letto di prova. Puoi pubblicare il codice dell'ascoltatore e il codice di prova? – pgreen2

risposta

1

Nessun aggiornamento è fatto sul lato proprietario (tabella Pck), ciò che viene aggiornata è la tabella che contiene i dati della raccolta (PckDest).

Penso che sia persino discutibile che la modifica dei contenuti della raccolta possa essere considerata un aggiornamento, poiché potrebbe e verrà spesso implementata come eliminazione e inserimento.

Penso che si debba gestire tale comportamento al di fuori del ciclo di vita della gestione dell'entità, o avere un qualche tipo di campo all'interno dell'entità proprietario che viene aggiornato in un cambio di lista (come una sorta di checksum), in modo che quando si cambia il elencare anche il genitore deve essere aggiornato (anche se non so se questa è una buona idea).

+0

thx, in realtà ho finito aggiungendo un blocco ottimistico alla tabella principale e questo mi ha finalmente richiamato il listener, quando confronta le versioni. Ancora nessuna ragione per cui questo non funziona come dovrebbe funzionare. – maverick

2

Alla fine risolviamo questo aggancio aggiungendo il blocco ottimizzato @Version, che impone l'ibernazione di scrivere nella tabella padre principale e i nostri ascoltatori vengono chiamati.

In ogni caso, questo non funziona ancora il modo in cui dovrebbe funzionare, ma la linea di fondo che non fa male ad avere il blocco ottimistico in luogo sia

Grazie

Problemi correlati