我正在研究遗留系统,其中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()DO关心对象标识符!所以现在我在尝试存储反序列化的对象时得到一个org.hibernate.NonUniqueObjectException。
我认为解决这个问题的最不具侵入性的方法是,如果可能的话,让XStream为每个数据库id创建1个对象。但这可能吗?
答案 0 :(得分:0)
经过一番考虑,我觉得问题不是XStream,因为它有对象引用的机制。问题是我正在研究的项目的另一个漂亮的“功能” - 它有每个域类的2个版本,一个用于与Hibernate进行通信,一个用于“逻辑使用”(不要问我为什么......)在这两个版本之间的转换(基本上将值从一个对象移动到另一个对象)中,对象是不加批判的新对象,导致相同的“Hibernate对象”被转换为多个“Java对象”。然后,我不能责怪XStream不理解这些应该是相同的:)