2013-02-24 39 views
0

我偶然發現了一個使用@XmlAdapter的奇怪問題。讓我試着勾畫的情況:使用@XmlAdapter時,Glassfish服務器緩存沒有得到更新?

在服務器端我有一個類奶牛:

@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添加一個新的Sample時,它將正確地封送到發送給web服務的xml字符串(包括Cow對象)中。一個新條目被正確添加到數據庫中。

但是,當我再次請求相同的Cow(包括samplesList)時,新的Sample不會添加,但它在數據庫中?當我重新啓動glassfish實例時,它顯示..爲什麼是這樣,我應該使用另一種方法來避免這種情況?

編輯:刪除樣本時會發生相同的行爲。它從數據庫中刪除,但仍包含在Cow請求的響應中。這與glassfish的緩存有什麼關係?

編輯2:我找到了某種解決方案。我改變了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; 
} 

但是,有人可以告訴我,如果這是最好的辦法嗎?

在此先感謝。

回答

0

殘疾人Glassfish的緩存現在被添加屬性persistence.xml中

相關問題