我正在使用 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 个对象。但这可能吗?