使用@XmlAdapter时,Glassfish服务器缓存无法更新?

时间:2013-02-24 14:22:26

标签: java jpa jaxb glassfish jersey

我使用@XmlAdapter偶然发现了一个奇怪的问题。让我试着勾画出情况:

在服务器端,我有一个班级奶牛:

@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时,它会纠正到一个xml字符串(包括Cow对象),该字符串被发送到webservice。新条目已正确添加到数据库中。

然而,当我再次请求相同的Cow(包含samplesList)时,新的Sample不会被添加到数据库中吗?当我重新启动glassfish实例时,它会显示..为什么这样,我应该使用另一种方法来避免这种情况吗?

编辑:删除样本时会发生相同的行为。它会从数据库中删除,但仍包含在Cow请求的响应中。这与glassfish的缓存有关吗?

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;
}

然而,如果这是最好的方法,有人可以告诉我吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

现在通过向persistence.xml添加属性来禁用Glassfish缓存

答案 1 :(得分:0)

你需要保持关系的双方。如果您创建一个新样本,则需要将其添加到其Cow样本中。

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side