【问题标题】: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 接口并自己编写所有方法,只要您需要它的合同或完整功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2018-09-22
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多