Spring data-mongodb ID自增长注解实现

教程分享 > Java教程 > Spring (5233) 2024-08-07 11:05:25

1.创建一个文档。类似一个序列的作用

package com.leftso.autoid;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

/**
 * 系统自增长表id存放表
 * 
 * @author xq
 *
 */
@Document(collection = "sys_sequence")
public class SequenceId {
	@Id
	private String id;

	@Field("seq_id")
	private long seqId;

	@Field("coll_name")
	private String collName;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public long getSeqId() {
		return seqId;
	}

	public void setSeqId(long seqId) {
		this.seqId = seqId;
	}

	public String getCollName() {
		return collName;
	}

	public void setCollName(String collName) {
		this.collName = collName;
	}

}

2.创建一个自定义注解用于处理需要自增长的ID

package com.leftso.autoid;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义自增长ID注解
 * 
 * @author xq
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface AutoValue {

}


3.重写新增的监听事件

注意:各大网站可能会有相似的代码。以下部分和spring data mongodb版本有关。下面代码中重写的public void onBeforeConvert(final Object source)方法在1.8版本开始就废弃了,不过官方推荐: Please use onBeforeConvert(BeforeConvertEvent),以下则为1.8以后版本的使用方法
package com.leftso.autoid;

import java.lang.reflect.Field;

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.BeforeSaveEvent;
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;

@Component
public class SaveEventListener extends AbstractMongoEventListener<Object> {
	@Autowired
	private MongoTemplate mongo;

	@Override
	public void onBeforeSave(BeforeSaveEvent<Object> event) {
		Object source = event.getSource();
		if (source != null) {
			ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() {
				public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
					ReflectionUtils.makeAccessible(field);
					// 如果字段添加了我们自定义的AutoValue注解
					if (field.isAnnotationPresent(AutoValue.class) && field.get(source) instanceof Number
							&& field.getLong(source) == 0) {
						// field.get(source) instanceof Number &&
						// field.getLong(source)==0
						// 判断注解的字段是否为number类型且值是否等于0.如果大于0说明有ID不需要生成ID
						// 设置自增ID
						field.set(source, getNextId(source.getClass().getSimpleName()));

					}
				}
			});
		}
	}

	/**
	 * 获取下一个自增ID
	 * 
	 * @param collName
	 *            集合(这里用类名,就唯一性来说最好还是存放长类名)名称
	 * @return 序列值
	 */
	private Long getNextId(String collName) {
		Query query = new Query(Criteria.where("coll_name").is(collName));
		Update update = new Update();
		update.inc("seq_id", 1);
		FindAndModifyOptions options = new FindAndModifyOptions();
		options.upsert(true);
		options.returnNew(true);
		SequenceId seq = mongo.findAndModify(query, update, options, SequenceId.class);
		return seq.getSeqId();
	}
}


4.使用自定义注解完成ID自增长的实现

package com.leftso.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import com.leftso.autoid.AutoValue;

@Document
public class Student {
	@AutoValue
	@Id
	private long id;
	private String name;

	public Student(String name) {
		super();
		this.name = name;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 
https://www.leftso.com/article/268.html

相关文章
Spring data-mongodb ID自增长注解实现,mongodb ID自增长
Java编程中使用spring boot1.5.2框架整合spring data mongodb10.1,来使用mongodb数据库
数据库中有一个bigint类型数据(mybatis plus自增长的id),对应java后台类型为Long型,在某个查询页面中碰到了问题:页面上显示的数据和数据库中的数据不一致
1.引言Spring 5通过引入一种名为Spring WebFlux的全新反应框架来支持响应式编程范例
spring boot 整合spring security采用mongodb数据库方式
Spring框架自带了一个任务调度器,虽然默认的方式只能通过配置写死,但是也可以自己适当运用
一、SpringBoot默认的错误处理机制1)浏览器,返回一个默认的错误页面2)如果是其他客户端(app),默认响应一个json数据(postman模拟)客户端
出现@Transactional事务不生效原因shiro 的Realm 中注入了用到事务的service,例如下面的​ /** * 自定义权限认证器 * 自定义实现Realm,实现自定义获取...
spring boot 2.0 security 5.0 整合,实现自定义表单登录。spring boot 2.0框架使用。
Spring Boot 2.0,Spring框架的Spring Boot 中的Spring Boot Actuator变化讲解。并且了解如何在Spring Boot 2.0中使用Actuator...
在 Spring 框架中,我们可以在 6 个内置的spring bean 作用域内创建 bean ,您也可以定义自定义 bean 作用域。在这六个作用域中,只有在您使用 Web 感知的Appli...
在这个Spring Boot示例中,学习将 Web 应用程序配置为使用自签名证书在 SSL (HTTPS) 上运行
Spring框架中,可以在6个内置的Scope中创建bean,也可以定义自定义范围。 在这六个范围中,只有在使用Web感知的ApplicationContext时才有四个范围可用。singlet...