0

@XmlAdapter を使用して奇妙な問題に遭遇しました。状況をスケッチしてみましょう。

サーバー側には、Cows クラスがあります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Cows implements Serializable {
    ...a bunch of cow properties like ID, name, ...

    @XmlElementWrapper(name = "sampless")
    @XmlElement(name = "samples") 
    @OneToMany(mappedBy = "cowId")
    private List<Samples> samplesList;

    ...a bunch of getters & setters...
}

私はクラスのサンプルを持っています:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Samples implements Serializable {
    ...a bunch of samples properties like ID, cellcount, ...

    @JoinColumn(name = "cow_id", referencedColumnName = "id")
    @ManyToOne
    @XmlJavaTypeAdapter(CowsAdapter.class)
    private Cows cowId;
}

CowsAdapter クラス:

public class CowsAdapter extends XmlAdapter<Cows, Cows> {
    @Override
    public Cows unmarshal(Cows v) throws Exception {
        return v;
    }
    @Override
    public Cows marshal(Cows v) throws Exception {
        return null;
    }
}

上記のように、クライアントから Cow オブジェクトが要求された場合のサンプルのリストを含めます。

ここで、クライアント側で、Cow の新しいサンプルを追加しようとすると、Web サービスに送信される XML 文字列 (Cow オブジェクトを含む) に正しくマーシャリングされます。新しいエントリがデータベースに正しく追加されます。

ただし、同じ Cow を (samplesList を含めて) 再度要求すると、新しい Sample はデータベースにあるのに追加されませんか? グラスフィッシュ インスタンスを再起動すると、.. と表示されるのはなぜですか?

編集: サンプルを削除するときに同じ動作が発生します。これはデータベースから削除されますが、Cow リクエストの応答にはまだ含まれています。これはグラスフィッシュのキャッシュと関係がありますか?

Edit2:これに対する何らかの解決策を見つけました。次のように findById メソッドを変更しました。

@GET
@Path("cow/{id}")
@Produces({"application/xml"})
public Cows findById(@PathParam("id") Integer id) {
    //Cows cow = super.find(id);
    final Query qry = getEntityManager().createNamedQuery("Cows.findById", Cows.class);
    qry.setParameter("id", id);
    qry.setHint("javax.persistence.cache.storeMode", "REFRESH");

    Cows cow = (Cows) qry.getSingleResult();
    return cow;
}

ただし、これが最善のアプローチであるかどうかを誰かに教えてもらえますか?

前もって感謝します。

4

2 に答える 2

0

persistence.xml にプロパティを追加して、Glassfish キャッシュを今のところ無効にしました。

于 2013-06-04T11:51:19.320 に答える