Morphia与MongoDB的Table per class配置失效,如何实现同ObjectId?
解决Morphia + MongoDB中Table per Class模式下共享ObjectId的问题
要让user和assistant两个集合的文档共用同一个ObjectId,你需要调整Morphia的映射配置并手动处理ID复用,具体步骤如下:
1. 调整父类的ID字段访问权限
首先把User类里的@Id字段从private改为protected,这样子类Assistant能直接继承这个ID字段,避免Morphia在子类集合中生成重复的ID字段:
@Entity("user") public class User{ @Id protected ObjectId id; private String username; // 保持原有的getter/setter不变 public void setId(ObjectId id){ this.id = id; } public ObjectId getId(){ return this.id; } public void setUsername(String username){ this.username = username; } public String getUsername(){ return this.username; } }
2. 配置子类的Entity注解
在Assistant类的@Entity注解中添加noClassnameStored = true,告诉Morphia不要在子类文档中存储类型标识字段,因为我们不需要基于类型的查询,只需要两个独立集合共享ID:
@Entity("assistant", noClassnameStored = true) public class Assistant extends User{ private String fullname; // 原有的getter/setter不变 public String getFullname(){ return this.fullname; } public void setFullname(String fullname){ this.fullname = fullname; } }
3. 保存时手动复用同一个ID
Morphia默认会为每个新对象自动生成ObjectId,所以你需要手动生成一个共享ID,同时设置到User和Assistant对象中,再分别保存到各自的集合:
// 生成唯一的共享ObjectId ObjectId sharedId = new ObjectId(); // 创建并配置User对象 User user = new User(); user.setId(sharedId); user.setUsername("your_username"); // 创建并配置Assistant对象,复用同一个ID Assistant assistant = new Assistant(); assistant.setId(sharedId); assistant.setUsername(user.getUsername()); // 可以从User复制公共字段 assistant.setFullname("Your Full Name"); // 分别保存到对应的集合 datastore.save(user); datastore.save(assistant);
4. 验证查询结果
现在你可以通过同一个ID分别查询两个集合的文档,它们的ID会完全一致:
User foundUser = datastore.find(User.class).field("_id").equal(sharedId).first(); Assistant foundAssistant = datastore.find(Assistant.class).field("_id").equal(sharedId).first(); // 验证ID是否相同 System.out.println(foundUser.getId().equals(foundAssistant.getId())); // 输出true
关键注意事项
- 将父类ID设为
protected是为了让Morphia识别子类继承的是同一个ID字段,不会在assistant集合中额外生成ID字段。 noClassnameStored = true避免了Morphia在文档中添加冗余的类型标识,符合Table per Class的独立集合设计。- 必须手动设置共享ID,否则Morphia会为每个对象自动生成不同的ID,达不到你的需求。
内容的提问来源于stack exchange,提问作者Alireza Khajavi
相关产品推荐
相关产品推荐

