我使用@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;
}
然而,如果这是最好的方法,有人可以告诉我吗?
提前致谢。
答案 0 :(得分:0)
现在通过向persistence.xml添加属性来禁用Glassfish缓存
答案 1 :(得分:0)
你需要保持关系的双方。如果您创建一个新样本,则需要将其添加到其Cow样本中。