2

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

4

1 回答 1

0

EclipseLink 默认启用共享缓存。

见, http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

看来你已经以某种方式破坏了你的对象。也许您在创建对象时没有设置 ManyToOne。或者以某种方式在您的应用程序中将其设置为 null?

于 2012-11-12T15:13:17.400 回答