0

我正在使用 XStream 序列化对象以保持两个数据库同步的遗留系统。一个新对象首先存储在一个数据库中,然后将存储的对象序列化并发送到另一个数据库中。

直到最近,有问题的对象的结构是这样的:

public class Project {
    List<Milestone> milestones;
    [...]
}

但是,在改变需求之后,结构应该是这样的:

public class Project {
    List<Goal> goals;
}

public class Goal {
    List<Milestone> milestones;
}

为了保留对目标一无所知的遗留数据的里程碑,项目的最终结构是这样的:

public class Project {
    List<Goal> goals;
    List<Milestone> milestones;
}

因此,从项目到里程碑有两条路径,一条直接路径,另一条通过目标路径。当这个结构被反序列化和存储时,就会出现问题。当它被 XStream 反序列化时,直接连接到项目的里程碑对象与通过目标连接的对象成为不同的对象,即使它们具有相同的 id。

只要使用 Hibernate 的 Session#merge() 来持久化这个对象,就没有问题,因为只要 db 标识符相同,merge() 就不会关心对象标识符。

但是,我不能再为此使用 merge() ,而必须依赖 Session#save() 。并且 save() 确实关心对象标识符!所以现在我在尝试存储反序列化对象时得到一个 org.hibernate.NonUniqueObjectException 。

我认为解决这个问题的最不干扰的方法是,如果可能的话,让 XStream 为每个数据库 id 创建 1 个对象。但这可能吗?

4

1 回答 1

0

经过一番考虑,在我看来问题不在于 XStream,因为它具有对象引用机制。问题是我正在处理的项目的另一个漂亮的“功能” - 每个域类有 2 个版本,一个用于与 Hibernate 通信,一个用于“逻辑使用”(不要问我为什么......)在这两个版本之间的转换中(基本上将值从一个对象移动到另一个对象),对象被不加批判地新建,导致相同的“Hibernate-object”被转换为多个“Java-objects”。然后,我真的不能责怪 XStream 不理解这些应该是相同的 :)

于 2013-03-19T08:54:37.053 回答