【问题标题】:Same class mapped to multiple collections?同一个类映射到多个集合?
【发布时间】:2018-04-19 08:41:01
【问题描述】:
我想在数据库中有一个类的模板对象,并由这些对象的客户拥有/更改,这些对象都存储在数据库中。为此,我可以找出 3 个选项。
- 2 类,其中拥有的类采用模板对象来构造自身。这将创建 2 个几乎相同的类,并且从模板对象构造对我来说不合适。
- 同一类存储在 2 个集合中,以区分模板和拥有的对象。模板对象将具有一个冗余字段,该字段引用所拥有对象的客户端 ID。如果索引字段未初始化,我不确定是否可以关闭将索引字段写入数据库。此外,我似乎找不到将同一个类存储在不同集合中的方法。我正在使用
Datastore.save(..) 写入数据库,似乎集合名称是由类名选择的。我可以在班级级别更改它,但这仍然意味着我不能为这个班级创建 2 个不同的集合。
- 一个类,一个集合。我可以使用
ownerId 引用字段来指定对象是一个模板。但是,拥有对象的集合会迅速增长,并且需要经常访问模板,因此会产生开销。
好像有AdvancedDatastore,我没用过但是好像有AdvancedDatastore.save(String collection, T entity)。但是,它没有像更新、删除和许多其他方法那样的签名。所以我不确定如何在我的场景中正确使用它。
【问题讨论】:
标签:
java
database
mongodb
morphia
【解决方案1】:
我将我的 Datastore 实现迁移到自定义 BasisDAO 实现,我可以在其中使用 AdvancedDatastore 来提供集合名称。这是它的样子:
public class UserDAO extends BasicDAO<User, String> {
private final String collectionName;
public UserDAO(MongoClient mongoClient, Morphia morphia, String dbName, String collectionName) {
super(mongoClient, morphia, dbName);
this.collectionName = collectionName;
}
@Override
public Key<User> save(User entity) {
return ((AdvancedDatastore)getDatastore()).save(collectionName, entity);
}
@Override
public WriteResult delete(User entity) {
return ((AdvancedDatastore)getDatastore()).delete(collectionName, User.class, entity.getId());
}
public User getByName(String userName) {
return ((AdvancedDatastore)getDatastore()).createQuery(collectionName, User.class).field("name").equal(userName).get();
}
}
使用这个类,我可以为同一个类创建多个集合。
编辑
问题是,如果您使用未覆盖的基类中的方法,它将在默认集合中工作(默认为类名)。由于似乎没有支持集合名称的 DAO,我认为最好使用 AdvancedDatastore 从头开始滚动您自己的 DAO。您可以实现 DAO 接口并自己编写所有方法,只要您需要它的合同或完整功能。