MongoDB Spring Data - 将文档ID应用于子对象id fileds

时间:2018-02-22 11:59:56

标签: java mongodb spring-data spring-data-mongodb

请查看以下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层中使用一些反射黑客来做到这一点,但我希望有更好的解决方案来解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以使用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);
    }
  }
}

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

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