Domanda

Ho riscontrato un caso piuttosto strano in Java EE 6 in cui si utilizza il JPA EntityManager find il metodo insieme all'id primario di un'entità restituisce null, ma l'utilizzo dell'API dei criteri per selezionare tutte le entità con tale id funziona correttamente.

Ecco il codice che sto usando per find:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);

...ed ecco il codice che sto usando con l'API dei criteri:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> u = criteria.from(User.class);
TypedQuery<User> query = em.createQuery(
    criteria.select(u).where(builder.equal(u.get("id"), userId)));
user = query.getSingleResult();

Hai idea del perche find restituisce null ma Criteri trova l'utente?Ho provato questi due metodi alternativi nello stesso punto esatto del programma.

Ecco le parti rilevanti dell'entità utente:

@Entity
@Table(name = "USERS")
@Access(AccessType.PROPERTY)
public class User implements Serializable {
    ...
    private Long id;
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
    @SequenceGenerator(name = "user_id_generator", sequenceName = "user_sequence", allocationSize = 1)
    @Column(name="id")
    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    ...
}
È stato utile?

Soluzione

Ho capito il problema.Era dovuto a un campo nel database null dove non avrebbe dovuto essere consentito.Questo è dovuto al fatto che l'ho modificato a mano.Dopo aver aggiunto un valore a quel campo, il problema è andato via.

Altri suggerimenti

Quale fornitore stai usando?

Dove stai eseguendo questa scoperta, dentro o fuori da una transazione?Stai arrossendo e cancella gli em prima della ricerca?

Usando Eclipselink come fornitore, e il mio modello simile, non sono in grado di riprodurlo.

Assumendo il tuo provider può registrare SQL, stai vedendo SQL andando al DB sulla ricerca?Che aspetto ha lo SQL e esegue correttamente in SQL Plus etc ...

Confermo la soluzione.La stessa cosa mi è successa.Ho avuto le violazioni contrassegnate come NOT NULL, quindi durante il test nella mia app ho cambiato il limite nel database per due colloquio (tasti estranei), tuttavia non modificando l'attributo (optional = false) della relazione @ManyToOne nella mia classe di entità.Dopo aver eliminato l'attributo, quindi il modello è stato coerente con il database, tutto ha iniziato a funzionare bene. Strano che l'ambiente non produca un avvertimento o un'eccezione di qualche tipo.

Doppio Controllare che si stia passando un Long nel seguente snippet:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
.

Se ciò non aiuta, attivare la registrazione SQL per vedere cosa sta accadendo e confrontare il comportamento in entrambi i casi.

Una ragione potrebbe essere che il campo "ID" non è stato contrassegnato correttamente come ID per l'entità utente.

Come controllo sanitario Debug del tuo codice, prendendo il tempo prima di eseguire la ricerca per eseguire una query manuale sul database da solo per garantire che sia presente un record utente appropriato con l'ID che ti aspetti.

Se non è nel database, assicurarsi che il Gestore dell'entità sia stato fluso o la transazione corrente è stata commessa.

Ad esempio, se si utilizza Hibernate come fornitore, è possibile che l'oggetto sia "persistente" solo nella cache e le modifiche non sono state effettivamente spinte al database.Di conseguenza, i criteri che passano attraverso l'implementazione di Ibernazione recuperano l'oggetto, ma il Gestore dell'entità Trova non sarà in grado di individuare l'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top