MongoDB Spring 数据 - 将文档 ID 应用于子对象 ID 字段

MongoDB Spring Data - apply document id to child objects id fileds

请查看以下Mongo数据库文档:

@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);
    }
  }
}

我不得不说,这很丑陋,因为每次保存都会有两次数据库调用。

但我看不到任何其他方法。