尽管数据库正确,JPA Query有时会返回不完整的结果

时间:2012-11-11 11:14:00

标签: jpa eclipselink

我看到我的网络服务有些奇怪的行为。我正在使用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()吗?在我的情况下,我是否有必要为每个请求创建一个实体管理器?

1 个答案:

答案 0 :(得分:0)

EclipseLink默认启用共享缓存。

请参阅, http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

似乎你以某种方式破坏了你的对象。也许您在创建对象时未设置ManyToOne。或者以某种方式在你的应用程序中将其设置为null?