EntityManager.find找不到实体,但使用Criteria API

cdm*_*kay 7 hibernate java-ee criteria-api java-ee-6 jpa-2.0

我在Java EE 6中遇到了一个相当奇怪的情况,其中使用JPA EntityManager的find方法以及实体的主id返回null,但使用Criteria API选择具有该id的所有实体都可以正常工作.

这是我正在使用的代码find:

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

...这里是我使用Criteria 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();
Run Code Online (Sandbox Code Playgroud)

任何想法为什么find返回null但Criteria找到用户?我在程序中的完全相同的位置尝试了这两种替代方法.

以下是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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

cdm*_*kay 11

我解决了这个问题.这是因为数据库中的某个字段null是不允许的.这是因为我手工编辑.在我向该字段添加值后,问题就消失了.

  • 您可能希望为该列强制执行NOT NULL以用于将来的安全措施. (2认同)