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

牛适配器类:

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 没有添加,尽管它在数据库中?当我重新启动 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;
}

但是,有人可以让我知道这是否是最好的方法吗?

提前致谢。

4

2 回答 2

0

通过向 persistence.xml 添加属性暂时禁用 Glassfish 缓存

于 2013-06-04T11:51:19.320 回答
0

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

见, http ://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

于 2013-06-04T14:22:52.263 回答