Sto osservando un comportamento molto strano con una classe di entità e il caricamento di un oggetto di questa classe con JPA (hibernate entitymanager 3.3.1.ga). La classe ha un campo (incorporato), che viene inizializzato nella dichiarazione. Il setter del campo implementa un controllo nullo (cioè genera un'eccezione quando viene impostato un valore nullo).Strano comportamento JPA, campo inizializzato è nullo
...
@Entity
public class Participant extends BaseEntity implements Comparable<Participant> {
...
@Embedded
private AmsData amsData = new AmsData();
public void setAmsData(AmsData amsData) {
Checks.verifyArgNotNull(amsData, "amsdata");
this.amsData = amsData;
}
...
}
Quando torno a questo oggetto con JPA, il campo è nullo, se non ci sono dati nel db per i campi di cui l'oggetto incorporato.
...
public class ParticipantJpaDao implements ParticipantDao {
@PersistenceContext
private EntityManager em;
@Override
public Participant getParticipant(Long id) {
return em.find(Participant.class, id);
}
...
}
ho debug il processo con un watchpoint sul campo (dovrebbe fermare quando il campo si accede o modificato), e vedo una modifica quando il campo viene inizializzato, ma quando ottengo il risultato dalla chiamata find , il campo è nullo.
Qualcuno può spiegare, perché è così? Come posso garantire che il campo non sia nullo, anche quando non ci sono dati per i campi dell'oggetto incorporato nel db (oltre a impostarlo manualmente dopo la chiamata di ricerca).
Questo potrebbe essere dovuto al tuo motore di associazioni lazy loading di persistenza? –
Uso il caricamento lazy, ma questo è un campo incorporato, quindi memorizzato nella stessa tabella. C'è la possibilità di annotare questo per essere impazientemente preso? – Dominik
Problema di ibernazione correlato (tratto dalla risposta cancellata): [HHH-7610: opzione per l'impostazione del campo @Embedded null quando tutte le colonne sono NULL] (https://hibernate.atlassian.net/browse/HHH-7610) – sleske