2013-02-24 61 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中