/lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/MongoInsertEventListener.java

https://github.com/YunaiV/SpringBoot-Labs · Java · 69 lines · 39 code · 8 blank · 22 comment · 2 complexity · 4aa95294bdb174734b97f0c558b4a08b MD5 · raw file

  1. package cn.iocoder.springboot.lab16.springdatamongodb.mongo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.mongodb.core.FindAndModifyOptions;
  4. import org.springframework.data.mongodb.core.MongoTemplate;
  5. import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
  6. import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
  7. import org.springframework.data.mongodb.core.query.Criteria;
  8. import org.springframework.data.mongodb.core.query.Query;
  9. import org.springframework.data.mongodb.core.query.Update;
  10. import org.springframework.stereotype.Component;
  11. import java.util.HashMap;
  12. @Component
  13. public class MongoInsertEventListener extends AbstractMongoEventListener<IncIdEntity> {
  14. /**
  15. * sequence - 集合名
  16. */
  17. private static final String SEQUENCE_COLLECTION_NAME = "sequence";
  18. /**
  19. * sequence - 自增值的字段名
  20. */
  21. private static final String SEQUENCE_FIELD_VALUE = "value";
  22. @Autowired
  23. private MongoTemplate mongoTemplate;
  24. @Override
  25. public void onBeforeConvert(BeforeConvertEvent<IncIdEntity> event) {
  26. IncIdEntity entity = event.getSource();
  27. // 判断 id 为空
  28. if (entity.getId() == null) {
  29. // 获得下一个编号
  30. Number id = this.getNextId(entity);
  31. // 设置到实体中
  32. // noinspection unchecked
  33. entity.setId(id);
  34. }
  35. }
  36. /**
  37. * 获得实体的下一个主键 ID 编号
  38. *
  39. * @param entity 实体对象
  40. * @return ID 编号
  41. */
  42. private Number getNextId(IncIdEntity entity) {
  43. // 使用实体名的简单类名,作为 ID 编号
  44. String id = entity.getClass().getSimpleName();
  45. // 创建 Query 对象
  46. Query query = new Query(Criteria.where("_id").is(id));
  47. // 创建 Update 对象
  48. Update update = new Update();
  49. update.inc(SEQUENCE_FIELD_VALUE, 1); // 自增值
  50. // 创建 FindAndModifyOptions 对象
  51. FindAndModifyOptions options = new FindAndModifyOptions();
  52. options.upsert(true); // 如果不存在时,则进行插入
  53. options.returnNew(true); // 返回新值
  54. // 执行操作
  55. @SuppressWarnings("unchecked")
  56. HashMap<String, Object> result = mongoTemplate.findAndModify(query, update, options,
  57. HashMap.class, SEQUENCE_COLLECTION_NAME);
  58. // 返回主键
  59. return (Number) result.get(SEQUENCE_FIELD_VALUE);
  60. }
  61. }