Spring 数据 mongo - 唯一的随机生成字段
Spring data mongo - unique random generated field
我正在使用 spring 数据 mongo。我在文档中有一个集合,当我向其中添加一个项目时,我想为其分配一个新的自动生成的唯一标识符,例如(someGeneratedId)
@Document(collection = "questionnaire")
public class Questionnaire {
@Id
private String id;
@Field("answers")
private List<Answer> answers;
}
public class Answer {
private String someGeneratedId;
private String text;
}
我知道我可以使用 UUID.randomUUID()
(包装在某种服务中)并设置值,我只是想知道是否有现成的东西可以处理这个问题?来自 here @Id
似乎特定于 mongo 中的 _id
字段:
The @Id annotation tells the mapper which property you want to use for
the MongoDB _id property
TIA
不,没有现成的解决方案可以为嵌入式文档的属性生成 ID。
如果你想让它远离你的业务逻辑,你可以实现一个 BeforeConvertCallback
来为你的嵌入对象生成 id。
@Component
class BeforeConvertQuestionnaireCallback implements BeforeConvertCallback<Questionnaire> {
@Override
public Questionnaire onBeforeConvert(@NonNull Questionnaire entity, @NonNull String collection) {
for (var answer : entity.getAnswers()) {
if (answer.getId() == null) {
answer.setId(new ObjectId().toString());
}
}
return entity;
}
}
您也可以以更通用的方式实现它:
创建新注释:@AutogeneratedId
。
然后收听所有实体的所有 BeforeConvertCallback
并使用反射遍历属性。如果为空,则每个使用新注释注释的 属性 都会获得一个唯一的 ID。
我正在使用 spring 数据 mongo。我在文档中有一个集合,当我向其中添加一个项目时,我想为其分配一个新的自动生成的唯一标识符,例如(someGeneratedId)
@Document(collection = "questionnaire")
public class Questionnaire {
@Id
private String id;
@Field("answers")
private List<Answer> answers;
}
public class Answer {
private String someGeneratedId;
private String text;
}
我知道我可以使用 UUID.randomUUID()
(包装在某种服务中)并设置值,我只是想知道是否有现成的东西可以处理这个问题?来自 here @Id
似乎特定于 mongo 中的 _id
字段:
The @Id annotation tells the mapper which property you want to use for the MongoDB _id property
TIA
不,没有现成的解决方案可以为嵌入式文档的属性生成 ID。
如果你想让它远离你的业务逻辑,你可以实现一个 BeforeConvertCallback
来为你的嵌入对象生成 id。
@Component
class BeforeConvertQuestionnaireCallback implements BeforeConvertCallback<Questionnaire> {
@Override
public Questionnaire onBeforeConvert(@NonNull Questionnaire entity, @NonNull String collection) {
for (var answer : entity.getAnswers()) {
if (answer.getId() == null) {
answer.setId(new ObjectId().toString());
}
}
return entity;
}
}
您也可以以更通用的方式实现它:
创建新注释:@AutogeneratedId
。
然后收听所有实体的所有 BeforeConvertCallback
并使用反射遍历属性。如果为空,则每个使用新注释注释的 属性 都会获得一个唯一的 ID。