我看到我的网络服务有些奇怪的行为。我正在使用JAXRS的jersey和JPA的eclipselink。我怀疑问题出在JPA的某个地方。为了简短起见,我有两个实体:历史和挑战。
@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() {
}
}
历史记录和挑战的所有条目都存在于数据库中,不会更改。通常,当我查询所有历史记录时,我会收回所有条目,并且每个历史记录都附有挑战。但是,有时,一个或两个历史条目对Challenge成员为空(尽管db处于完美顺序)。如果我在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()吗?在我的情况下,我是否有必要为每个请求创建一个实体管理器?
答案 0 :(得分:0)
EclipseLink默认启用共享缓存。
请参阅, http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F
似乎你以某种方式破坏了你的对象。也许您在创建对象时未设置ManyToOne。或者以某种方式在你的应用程序中将其设置为null?