Ho riscontrato un caso piuttosto strano in Java EE 6 dove l'uso del metodo find
di EntityManager di JPA insieme all'ID principale di un'entità restituisce null, ma utilizzando i criteri API per selezionare tutte le entità con quell'id funziona bene.EntityManager.find non trova l'entità, ma utilizzando l'API Criteri fa
Ecco il codice che sto utilizzando 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 utilizzando con l'API 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();
Qualsiasi idea del perché find
rendimenti null ma Criteria trova l'utente? Ho provato questi due metodi alternativi nello stesso identico punto del programma.
Qui ci sono le porzioni rilevanti del entità User:
@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;
}
...
}
Non sono sicuro se questo fa la differenza, ma userId un valore Long o forse un intero nel tuo codice? –
È un lungo, l'ho ricontrollato. – cdmckay
Ho appena sperimentato questo problema con Hibernate 4.1.8.Final – molholm