gpt4 book ai didi

java - MongoDB Spring Data - 将文档 id 应用到子对象 id 字段

转载 作者:行者123 更新时间:2023-12-02 11:36:03 24 4
gpt4 key购买 nike

请查看以下 Mongo DB 文档:

@Document(collection = CitizenForumMessageDocument.COLLECTION_NAME)
public class ImageDocument {

public static final String COLLECTION_NAME = "images";

@Id
private String id; // autogenerated
private Image data; // data for the client (web, mobile...)
private ImageMeta meta; // for internal application work (uploader ip, etc...)

[...] // getter, setter

}

// send as is to a client
public class Image {

private String id;

[...]
}

是否可以在创建文档时将文档 ID 应用于 Image id。

我现在是怎么做的:

public void saveUploadedImage(Client client, ImageForm form) {

ImageDocument doc = new ImageDocument();

dao.save(doc); // create document cause we need an id...

try {
doc.setImage(createImage(form, doc.getId()));
doc.setMeta(createMeta(client, form));
} catch(Exception e){
dao.remove(doc);
return; // ugly...
}

dao.update(doc);
}

我也可以通过在我的 dao 层中使用一些反射 hack 来做到这一点,但我希望有一个更好的解决方案来解决这个问题。

最佳答案

您可以使用Mongo Lifycycle Events为了这。

@Component
public class MongoListener extends AbstractMongoEventListener<ImageDocument>
{

private final MongoTemplate mongoTemplate;

@Autowired
public MongoListener(final MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}

@Override
public void onAfterSave(AfterSaveEvent<ImageDocument> event) {

ImageDocument imageDocument = event.getSource();
if(imageDocument.getData().getId() == null) {
imageDocument.getData().setId(imageDocument.getId());
mongoTemplate.save(imageDocument);
}
}
}

我必须说,这非常难看,因为每次保存都会有两次数据库调用。

但我没有看到任何其他方法可以做到这一点。

关于java - MongoDB Spring Data - 将文档 id 应用到子对象 id 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com