Java XStream-使用与对象相同的标识符处理对象

Java XStream-使用与对象相同的标识符处理对象,java,hibernate,xstream,Java,Hibernate,Xstream,我正在一个遗留系统上工作,其中XStream用于序列化对象,以保持两个数据库同步。新对象首先存储在一个数据库中,然后将存储的对象序列化并发送到另一个数据库中存储 直到最近,所讨论对象的结构是这样的: public class Project { List<Milestone> milestones; [...] } public class Project { List<Goal> goals; } public class Goal {

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

直到最近,所讨论对象的结构是这样的:

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

public class Goal {
    List<Milestone> milestones;
}
公共类项目{
列出里程碑;
[...]
}
但是,在需求发生变化后,结构应该是这样的:

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的会话#merge()用于持久化这个对象,就没有问题,因为只要db标识符相同,merge()就不关心对象标识符

但是,我不能再为此使用merge(),而必须依赖Session#save()。和save()确实关心对象标识符!因此,现在我在尝试存储反序列化对象时遇到了org.hibernate.ununiqueobjectexception


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

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

我认为应该可以通过。能否添加用于序列化和反序列化对象的代码?XML文件是否使用对象引用?检查以确保在XML中引用了预期相同的里程碑的两个实例。一个可能是明确定义的,在一个项目->目标->里程碑中,它应该反向引用已经定义的一个。我认为它实际上有反向引用机制,经过一些考虑后,问题不是由于序列化本身,而是由于项目的另一个很好的“特性”——我将创建一个解释。