2

我正在尝试逐步淘汰使用 MongoDB/Morphia 的旧 Java 代码库。在此过渡期间,我希望新平台能够写入相同的 MongoDB 数据库/集合,以便每个数据库/集合可以并存一段时间。那部分我做得很好。我的问题是,在新平台中,我使用 morphia 映射的对象需要与当前集合中的对象不同的包/类结构。

例如,在旧平台上我有这个类:

package com.foo;

@Entity
public class Bar {
    @Id private String id;
    private String name;
    ...
}

在我的 mongo 数据库中,我现在有一个集合“Bar”,它的文档将 className 属性设置为“com.foo.Bar”。这一切都很棒。

我想在新平台上做的是在不同的包中创建一个全新的类来表示该实体,但让它以相同的方式与 mongo 交互。我希望能够做这样的事情:

package com.foo.legacy;

@Entity("com.foo.Bar")
public class LegacyBar {
    @Id private String id;
    private String name;
    ...
}

我意识到上面的方法不起作用,但是如果我将注释更改为 @Entity("Bar") 我不会收到任何错误,但是当我通过 id 查找实体时,我总是会返回 null。

那么...有什么方法可以让我拥有 2 个具有 2 个类结构和 2 个不同 Morpha 配置的独立 VM,以便每个 VM 都可以以相同的方式写入相同的数据库/集合?

如果我将 LegacyBar 更改为“Bar”并在一个名为“com.foo”的包中创建它,那么一切都会按预期工作。我真的更希望能够灵活地以半干净的方式隔离所有这些遗留数据。

4

1 回答 1

4

你甚至需要这个className属性吗?

你可以禁用它

@Entity(value = "Bar", noClassnameStored = true)

并删除数据库中的属性。

引用官方文档

你为什么需要它? 这主要用于在同一个集合中存储不同的实体并将它们作为基类或超类读回时使用。

如果您不这样做,那么允许不同的包结构应该是一个简单的解决方法。

于 2013-10-29T20:49:21.460 回答