【问题标题】:@Id generated value in monogdb spring mvc@Id 在 mongodb spring mvc 中生成的值
【发布时间】:2016-11-05 00:51:41
【问题描述】:

我正在尝试为我的数据库生成不同的 id,但它保持生成 0 并删除旧记录我如何在此代码中生成 id,知道我需要 id 为前端角度服务的 int。

@Document(collection = "tasks")
public class Task {

    @Id
    @Field(value = "task_id")
    private int id;

    @Field(value = "task_name")
    private String taskName;

    @Field(value = "task_description")
    private String taskDescription;

    @Field(value = "task_priority")
    private String taskPriority;

    @Field(value = "task_status")
    private String taskStatus;

    @Field(value = "task_archived")
    private int taskArchived = 0;

   //set and get

}

【问题讨论】:

    标签: spring mongodb spring-mvc spring-boot


    【解决方案1】:

    我找到了两种方法来做第一个

    private static final AtomicInteger counter = new AtomicInteger();
    
        public static int nextValue() {
            return counter.getAndIncrement();
        }
    
        /*******************/
    
        @Id
        @Field(value = "task_id")
        private int id = nextValue();
    

    我认为第二个技巧是将当前日期用作整数

    private int id = (int) (new Date().getTime()/1000); 
    

    【讨论】:

    • 我认为最好的方法是我建议你做的。有一个增量器并在其上练习原子增量。假设以后有多个线程可以使用这个类。 @Transient 用于忽略持久性领域。查看我的编辑
    【解决方案2】:

    最简单的方法是使用Java提供的一种方法生成唯一ID

    1. UUID(通用唯一 ID)
    2. SecureRandom 和 MessageDigest
    3. UID
    4. 原子整数增量(这是您需要的)
    5. 还有许多其他方法

    根据您的需要选择最合适的。这是解决您问题的 AtomicInteger 方法:

        @Document(collection = "tasks")
        public class Task {
    
            @Id
            @Field(value = "task_id")
            private int id;
    
            @Field(value = "task_name")
            private String taskName;
    
            @Field(value = "task_description")
            private String taskDescription;
    
            @Field(value = "task_priority")
            private String taskPriority;
    
            @Field(value = "task_status")
            private String taskStatus;
    
            @Field(value = "task_archived")
            private int taskArchived = 0;
    
            @Transient
            private AtomicInteger incrementor = new AtomicInteger(0);
    
            public Task() {
              id = incrementor.incrementAndGet(0);
            }
                 //set and get
        }
    

    您还必须使用@Transient 来避免增量器被持久化在文档存储中。

    【讨论】:

    • id = ai.incrementAndGet(0);中的ai变量是什么
    • @Transient 不适用于构造函数
    • 我通过一个小技巧解决了它 private int id = (int) (new Date().getTime()/1000);
    猜你喜欢
    • 2016-07-23
    • 2014-06-23
    • 2015-12-10
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多