同一个类映射到多个集合?

时间:2018-04-19 08:41:02

标签: java database mongodb morphia

我希望在数据库中拥有类的模板对象,并且这些对象的客户端拥有/更改这些对象,这些对象都存储在数据库中。要做到这一点,我可以找出3个选项。

  • 2个类,其中所拥有的类采用模板对象来构造自身。这将创建2个几乎相同的类,并且从模板对象构造对我来说感觉不对。
  • 存储在2个集合中的同一个类,以区别于模板和拥有的对象。模板对象将具有一个冗余字段,该字段引用所拥有对象的客户端ID。如果没有初始化,我不确定是否可以关闭将索引字段写入数据库。此外,我似乎无法找到一种方法将同一个类存储在不同的集合中。我使用Datastore.save(..)写入数据库,似乎集合名称是由类名选择的。我可以在班级改变这一点,但这仍然意味着我不能为这个班级创建2个不同的集合。
  • 一个班级,一个馆藏。我可以使用ownerId引用字段来指定对象是模板。但是,拥有对象的集合将快速增长,并且需要经常访问模板,因此这会产生开销。

似乎有AdvancedDatastore,我没有使用它,但似乎有AdvancedDatastore.save(String collection, T entity)。但是,它没有像更新,删除和许多其他方法那样的签名。所以我不确定如何在我的场景中正确使用它。

1 个答案:

答案 0 :(得分:0)

我将SELECT TOP 10 * FROM ( SELECT e.EmployeeId, COUNT(*) AS SalesCount FROM Employees e LEFT OUTER JOIN Orders o ON o.EmployeeId=e.EmployeeId AND DATEPART(year, o.OrderDate)=1997 GROUP BY e.EmployeeId ) groups ORDER BY SalesCount DESC 实施迁移到自定义Datastore实现,我可以使用BasisDAO提供集合名称。这是它的样子:

AdvancedDatastore

使用这个类我可以为同一个类创建多个集合。

修改

问题是,如果您使用未被覆盖的基类中的方法,它将在默认集合中工作(默认情况下为类名)。由于似乎没有支持集合名称的DAO,我认为从头开始用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会更好。您可以实现DAO界面,并在您需要合同或完整功能时自行编写所有方法。