Encontré un caso bastante extraño en Java EE 6 donde el uso del método find
de JPA EntityManager junto con el ID primario de una entidad devuelve nulo, pero usando los Criterios API para seleccionar todas las entidades con esa id funciona bien.EntityManager.find no puede encontrar entidad, pero al usar la API Criteria
Aquí está el código que estoy usando para find
:
// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
... y aquí está el código que estoy usando con la API Criterios:
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();
idea de por qué vuelve find
nulo pero Criteria encuentra al Usuario? Probé estos dos métodos alternativos exactamente en el mismo lugar del programa.
Estas son las partes pertinentes de la entidad Usuario:
@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;
}
...
}
No estoy seguro de si esto hace la diferencia, pero ¿el ID de usuario es largo o tal vez es un número entero en tu código? –
Es un largo, lo comprobé dos veces. – cdmckay
Acabo de experimentar este problema con Hibernate 4.1.8.Final – molholm