我有一个通用的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的实例,但是我有一些约束:
-
我无法将Spring注释添加到基类(但我可以继承
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);
}
}
这会导致spring为 _id
使用 name
的值,但当然它不会在Mongodb中存储名为"name"的字段 . The documentation表示spring将使用名为"id"的"property or field"或使用 @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”的无意义字段 .
有更合理的方式来获得我想要的东西吗?我开始尝试合理的是什么?
1 回答
感谢@ mp911de的提示,我最终创建了一个
Thing
的子类,如下所示:@TypeAlias
注释会覆盖spring将用于该类型的名称,以掩盖我为了添加注释而创建子类的事实 .@Id
说这是_id
的吸气剂 .@AccessType
表示通过getter和setter访问此字段,而不是直接访问该字段 . 这就是我需要的;没有它,spring会查找名为id
的私有成员变量 .@JsonIgnore
是Jackson(我们正在使用的JSON库)注释,以防止在将这些对象序列化为JSON时包含id
字段 .