import java.lang.annotation.*;
/**
* 定义一个主键自增的标志注解
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface AutoInc {
}
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.MongoId;
/**
* id的自增进度需要一个数据表存储(只是存储当前id号数据,可以不用数据库而用其他形式)
*/
@Document
@Data
public class AutoincrementID {
@MongoId
private String id;
@Field
private String collectionName = "ccc"; //需要连接的集合
@Field
private Long incrId;
}
import java.lang.reflect.Field;
import com.seefar.system.domain.mongo.MongoOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
/**
* 对mongodb保存过程进行监听,实现主键的递增
*/
@Component
public class SaveEventListener extends AbstractMongoEventListener<Object>{
private static final Logger logger= LoggerFactory.getLogger(SaveEventListener.class);
@Autowired
private MongoTemplate mongo;
@Override
public void onBeforeConvert(BeforeConvertEvent<Object> event) {
logger.info(event.getSource().toString());
//替换所需的实体类 类 source=(类)event.getSource();
MongoOperation source=(MongoOperation)event.getSource();
if (source != null) {
ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() {
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
ReflectionUtils.makeAccessible(field);
// 如果字段添加了我们自定义的AutoInc注解
if (field.isAnnotationPresent(AutoInc.class)) {
// 设置自增ID
field.set(source, getNextId(source.getClass().getSimpleName()));
}
}
});
}
}
private Long getNextId(String collName) {
Query query = new Query(Criteria.where("collName").is("ccc"));
Update update = new Update();
update.inc("incrId", 1);
FindAndModifyOptions options = new FindAndModifyOptions();
options.upsert(true);
options.returnNew(true);
AutoincrementID inc= mongo.findAndModify(query, update, options, AutoincrementID.class);
return inc.getIncrId();
}
}