我要存储具有特定ID的动态文档。通过动态文档,我指的是一个字符串到对象的映射,我并不真正关心确切的映射,以便以任意形式存储文档。但是,我希望通过编程方式指定的某个ID来标识这些文档,但我希望使用org.springframework.data.annotation.Id
声明该ID。这是我期望工作的文档映射:
@Document(collection = "mappings")
public final class Mapping
extends org.bson.Document { // implements Map<String, Object> implicitly
@Id
private String id;
public void setId(final String id) {
this.id = id;
}
}
各自的存储库:
@Repository
interface IMappingRepository
extends MongoRepository<Mapping, String> {
}
不幸的是,由于实现了Map
接口(我猜),ID注释似乎在映射中被完全忽略。例如,如果我自己指定_id
属性,我可以轻松覆盖密钥:
final Mapping mapping = new Mapping();
mapping.put("_id", "foo");
mappingRepository.save(mapping);
{&#34; _id&#34; :&#34; foo&#34;,&#34; _class&#34; :&#34; foo.Mapping&#34;,...}
但是,如果我像这样分配带注释的字段(我想使用的方式):
final Mapping mapping = new Mapping();
mapping.setId("foo");
mappingRepository.save(mapping);
然后我的映射无法自动分配密钥:
{&#34; _id&#34; :ObjectId(&#34; 585173b7853b017ee9c1468f&#34;),&#34; _class&#34; :&#34; foo.Mapping&#34;,...}
这个问题的另一个缺陷是,例如,存储库中的delete(entity)
无法抛出以下异常:
java.lang.IllegalArgumentException:给定的id不能为null!
在org.springframework.util.Assert.notNull(Assert.java:115)〜[spring-core-4.3.4.RELEASE.jar:4.3.4.RELEASE]
在org.springframework.data.mongodb.repository.support.SimpleMongoRepository.delete(SimpleMongoRepository.java:156)〜[spring-data-mongodb-1.9.5.RELEASE.jar:na]
在org.springframework.data.mongodb.repository.support.SimpleMongoRepository.delete(SimpleMongoRepository.java:166)〜[spring-data-mongodb-1.9.5.RELEASE.jar:na]
库源代码:
____ public void delete(ID id) {
156: Assert.notNull(id, "The given id must not be null!");
____ mongoOperations.remove(getIdQuery(id), entityInformation.getJavaType(), entityInformation.getCollectionName());
____ }
____
____ /*
____ * (non-Javadoc)
____ * @see org.springframework.data.repository.CrudRepository#delete(java.lang.Object)
____ */
____ public void delete(T entity) {
____ Assert.notNull(entity, "The given entity must not be null!");
166: delete(entityInformation.getId(entity));
____ }
看起来我的地图ID
始终被忽略,但mappingRepository.delete(id)
效果很好。
同样,@Field
注释也完全被忽略。
我缺少什么,如何将Spring Data MongoDB注释与类似地图的对象结合起来?或者是否可以打开&#34;展开&#34;映射顶层的映射字段(例如,Map<String, Object> map
可以某种方式注释,以便与父对象合并,类似于com.fasterxml.jackson.annotation.JsonUnwrapped
的设计用途?或者我只是错过了这样做的惯用方法吗?谢谢!
我想做一个小的修正:如果Mapping.id
字段从映射中移除(实际上缺少@Id
),则mappingRepository.delete(ID)
将失败并显示NullPointerException
。