Mi sono imbattuto in domande simili su StackOverflow, ho provato le soluzioni, ma non ho trovato una risposta.EclipseLink Chiamata JPA `@ PreUpdate` non persistente
Sto usando una strategia JPA abbastanza comune per impostare gli ultimi tempi modificati su alcune entità. Imposta le colonne e i campi, quindi contrassegna un metodo con @PreUpdate
e lascia che sia uguale all'ora corrente.
Il problema è che posso vedere nel debugger che il metodo viene chiamato e che il campo è in fase di aggiornamento, tuttavia nei registri di DB vedo solo una chiamata SQL a UPDATE il campo modificato che NON include un UPDATE per il campo timestamp.
Complementare ulteriormente le cose @PrePersist
funziona perfettamente, solo @PreUpdate
mostra questo comportamento.
La spiegazione più vicina che ho trovato finora è in questo LINK.
domande simili a: # 1.725.699 e # 1745890
Sto usando EclipseLink v2 e JPA v1 per la compatibilità con GlassFish v2.
Ho tentato di utilizzare entrambe le annotazioni direttamente sui metodi nella classe Entity, nonché un EntityListener
associato alla classe Entity con l'annotazione @EntityListener
.
Ho il sospetto che si tratti di un bug in EclipseLink, ma non posso provarlo.
Bug o non mi piacerebbe molto che questa semplice operazione funzioni. C'è qualcosa di sbagliato in questa implementazione? Si tratta di un problema noto in EclipseLink? Si tratta di un problema noto in JPA? C'è un modo per aggirare questo?
A corto di andare al database e utilizzare i trigger, c'è un percorso alternativo per consentire al mio codice Java di impostare il timestamp updated_on?
Grazie per il consiglio!
Segmenti di codice seguiti.
campiEntità:
@Column(name = "updated_on")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedOn;
@Column(name = "created_on")
@Temporal(TemporalType.TIMESTAMP)
private Date createdOn;
metodi di aggiornamento annotati:
@PreUpdate
public void setUpdatedOn(Timestamped object) {
object.setUpdatedOn(new Date());
}
@PrePersist
public void setCreatedOn(Timestamped object) {
if (object.getCreatedOn()==null) {
object.setCreatedOn(new Date());
}
}
Felix - Grazie per il chiarimento. Pensavo che fosse quello che stavo vedendo. Vedo come implementare la gestione di DescriptorEvent, quasi facile come annotare alcuni metodi. Devi solo trovare il file XML giusto per aggiungere il gestore. Grazie ancora! – Freiheit
Hi Freiheit, sto affrontando lo stesso problema in questo momento, ti dispiacerebbe condividere il tuo codice DescriptorEvent come esempio? :) grazie – sunnycmf
@Freiheit piacerebbe vedere anche la soluzione. Grazie in anticipo. –