L'EntityManager.trouver ne pouvez pas trouver de l'entité, mais à l'aide de l'API criteria n'

J'ai rencontré un cas assez curieux dans Java EE 6, où à l'aide de l'EntityManager est find méthode avec une entité primaire id renvoie null, mais à l'aide de l'API des Critères pour sélectionner toutes les entités id fonctionne très bien.

Voici le code que j'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 j'utilise avec les Critères de l'API:

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();

Aucune idée pourquoi find retourne null mais les Critères trouve l'Utilisateur? J'ai essayé ces deux méthodes de rechange dans la même place 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 est userId un Long ou peut-être un nombre Entier dans votre code?
C'est une Longue, j'ai vérifié que.
J'ai juste rencontré ce problème avec Hibernate 4.1.8.Final

OriginalL'auteur cdmckay | 2010-07-08