J'ai rencontré un cas plutôt étrange dans Java EE 6 où l'utilisation de la méthode find
de JPA EntityManager avec l'ID principal d'une entité renvoie null, mais en utilisant les critères API pour sélectionner toutes les entités avec cet ID fonctionne très bien.EntityManager.find ne peut pas trouver l'entité, mais en utilisant l'API Criteria
Voici le code que je utilise pour find
:
// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
... et voici le code que je utilise avec l'API Critères:
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();
Toute idée pourquoi find
retours null mais Criteria trouve l'utilisateur? J'ai essayé ces deux méthodes alternatives exactement au même endroit dans le programme.
Voici les parties pertinentes de l'entité utilisateur:
@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;
}
...
}
Vous ne savez pas si cela fait une différence, mais userId est-il long ou peut-être un entier dans votre code? –
C'est un long, j'ai vérifié cela. – cdmckay
Je viens de rencontrer ce problème avec Hibernate 4.1.8.Final – molholm