Ken*_*ter 4 spring-data-mongodb
我有一个通用的 POJO:
public class Thing {
private String name;
private String etc;
public String getName() {
return name;
}
// other getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我使用的是 Spring 4.3.9 和 Spring-data-mongodb 1.10.4。我想在 Mongodb 中存储这个 POJO 的实例,但我有一些限制:
Thing和注释)。name字段用作 Mongodb 的唯一 ID(主要是为了避免为其创建单独的唯一索引)。name字段存储为名为“name”的实际字段,以便集合的其他使用者不必知道“name”存储在_id.我开始尝试这个:
public class SpringThing extends Thing {
@Id
@Override
public String getName() {
return super.getName();
}
@Override
public void setName(String name) {
super.setName(name);
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致 spring 使用namefor的值_id,但当然它不会在 Mongodb 中存储名为“name”的字段。文档说 spring 将使用名为“id”或用@Id. 所以我尝试定义一个访问 name 字段的冗余 getter/setter:
public class SpringThing extends Thing {
@Id
public String getId() {
return super.getName();
}
public void setId(String id) {
super.setName(id);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,spring 忽略了getId和setId,并使用自动生成的 ID 存储对象。我还尝试创建用 注释的冗余 getter/setter @Field("name"),但 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);
}
}
Run Code Online (Sandbox Code Playgroud)
但它需要定义一个名为“id”的无意义字段。
有没有更合理的方法来获得我想要的东西?我开始尝试做的事情是否合理?
感谢@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);
}
}
Run Code Online (Sandbox Code Playgroud)
@TypeAlias注释将覆盖其弹性将使用的类型,来掩饰我已经创建了一个子类只是添加注释的事实名称。@Id说这是_id.@AccessType表示通过 getter 和 setter 访问该字段,而不是直接访问该字段。这就是我需要的;没有它,spring 会寻找一个名为id.@JsonIgnore是 Jackson(我们正在使用的 JSON 库)注释,以防止id在将这些对象序列化为 JSON 时包含该字段。| 归档时间: |
|
| 查看次数: |
2785 次 |
| 最近记录: |