我有一个通用的POJO:
public class Thing {
private String name;
private String etc;
public String getName() {
return name;
}
// other getters and setters
}
我使用Spring 4.3.9和Spring-data-mongodb 1.10.4。我想在Mongodb中存储这个POJO的实例,但我有一些约束:
Thing
并注释它。)name
字段用作Mongodb唯一ID(主要是为了避免为其创建单独的唯一索引)。name
字段存储为名为" name"的实际字段,以便该集合的其他消费者不必知道&#34 ;名称"存储在_id
。我开始尝试这个:
public class SpringThing extends Thing {
@Id
@Override
public String getName() {
return super.getName();
}
@Override
public void setName(String name) {
super.setName(name);
}
}
这会导致spring为name
使用_id
的值,但当然它并不存储名为" name"的字段。在Mongodb。 The documentation说春天将使用"属性或字段"命名" id"或注明@Id
。所以我尝试定义一个访问名称字段的冗余getter / setter:
public class SpringThing extends Thing {
@Id
public String getId() {
return super.getName();
}
public void setId(String id) {
super.setName(id);
}
}
不幸的是,spring在这里忽略getId
和setId
,并使用自动生成的ID存储对象。我还尝试创建用@Field("name")
注释的冗余getter / setter,但是spring似乎忽略了没有实际字段的任何getter / setter对。
添加实际ID字段并存储名称副本确实有效:
public class SpringThing extends Thing {
@Id
private String id;
@Override
public void setName(String id) {
this.id = id;
super.setName(id);
}
}
但它需要定义一个名为" id"。
的无意义字段有没有更合理的方法来获得我想要的东西?我开始尝试合理的是什么?
答案 0 :(得分:1)
感谢@ mp911de的提示,我最终创建了一个Thing
的子类,如下所示:
@TypeAlias("thing")
@Document(collection = "things")
public class SpringThing extends Thing {
@Id
@AccessType(Type.PROPERTY)
@JsonIgnore
public String getId() {
return super.getName();
}
public void setId(String taskName) {
super.setName(taskName);
}
}
@TypeAlias
注释会覆盖spring将用于该类型的名称,以掩盖我为了添加注释而创建子类的事实。@Id
说这是_id
。@AccessType
表示通过getter和setter访问此字段,而不是直接访问该字段。这就是我所需要的;没有它,spring会查找名为id
的私有成员变量。@JsonIgnore
是Jackson(我们正在使用的JSON库)注释,用于防止在将这些对象序列化为JSON时包含id
字段。