2

Webサービスで奇妙な動作が見られます。JAXRSにはジャージを使用し、JPAにはeclipselinkを使用しています。問題は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() {
    }
}

履歴とチャレンジのすべてのエントリはデータベースに存在し、変更されません。通常、すべての履歴を照会すると、すべてのエントリが返され、各履歴にはチャレンジが添付されます。ただし、チャレンジメンバーの履歴エントリの1つまたは2つがnullになる場合があります(ただし、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()を呼び出す必要がありますか?リクエストごとにエンティティマネージャーを作成する必要がありますか?

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 に答える