find
Java EE 6 で、エンティティのプライマリ ID とともにJPA EntityManager のメソッドを使用すると null が返されるというかなり奇妙なケースに遭遇しましたが、Criteria API を使用してその ID を持つすべてのエンティティを選択すると正常に動作します。
私が使用しているコードは次のfind
とおりです。
// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);
...そして、これが 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();
なぜfind
nullを返すのにCriteriaがユーザーを見つけるのか考えていますか? プログラムのまったく同じ場所で、これら 2 つの代替方法を試しました。
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;
}
...
}