我的网络服务出现了一些奇怪的行为。我将 jersey 用于 JAXRS,将 eclipselink 用于 JPA。我怀疑问题出在 JPA 的某个地方。简而言之,我有 2 个实体:历史和挑战。
@XmlRootElement
@Entity
public class History {
@Column
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;
@JoinColumn
@ManyToOne
public Challenge challenge;
public History() {
}
}
@XmlRootElement
@Entity
public class Challenge {
@Column
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;
@Column(length = 255)
public String title;
@Column(length = 1000)
public String description;
public Challenge() {
}
}
历史和挑战的所有条目都存在于数据库中并且不会更改。通常,当我查询所有历史记录时,我会取回所有条目,并且每个历史记录都附加一个挑战。但是,有时,一个或 2 个历史记录条目对于 Challenge 成员为空(尽管数据库处于完美状态)。如果我在 Tomcat 中重新加载应用程序,查询将再次正常运行。稍后,此错误再次出现。所以我猜这与我如何使用EntityManager有关。下面是查询所有历史的代码:
public List<History> getHistories() {
EntityManager em = emFactory.createEntityManager();
Query query = em.createQuery("SELECT h FROM History h");
List<History> list = (List<History>) query.getResultList();
em.close();
return list;
}
正如我之前所说,历史和挑战不会改变。但是,我还有其他一些引用历史的实体,也许我正在其他地方做一些会在这里触发这个问题的事情。我应该在我的方法中调用 em.clear() 还是 em.flush() ?在我为每个请求创建实体管理器的情况下是否有必要?