繁体   English   中英

mongodb spring数据保存

[英]mongodb spring data save

我对MongoDB和Spring Data还是很陌生,我正在做一些代码来提高自己的技能。

我认为我没事,但是我有一个问题(一个奇怪的问题)。

我有一个小例子,让我说说我正在编写一个小的费用报告工具,而不是经典的Hello Word。

这是TestMain应用

package com.jaex.model;

import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.jaex.repositories.ExpenseCategoryRepository;
import com.jaex.repositories.ExpenseRepository;
import com.jaex.repositories.ProjectRepository;
import com.jaex.repositories.UserRepository;



public class Main {


    public static void main(String[] args) {
        ApplicationContext ctx = new GenericXmlApplicationContext("spring-config.xml");



        ExpenseCategoryRepository ur = (ExpenseCategoryRepository) ctx.getBean("expenseCategoryRepository");
        ExpenseRepository ur1 = (ExpenseRepository) ctx.getBean("expenseRepository");
        UserRepository userrepo = (UserRepository) ctx.getBean("userRepository");
        ProjectRepository prjRepo = (ProjectRepository) ctx.getBean("projectRepository");


        Project p = prjRepo.findByProjectId("123456");
        if (p == null) {
            p = new Project("123456", "The Project", true, new Date());
            p = prjRepo.save(p);
        }


        ExpenseCategory c1 = ur.findByName("Dinner");
        if (c1 == null) {
            c1 = new ExpenseCategory("Dinner", "");
            c1 = ur.save(c1);
        }


        User user = userrepo.findByUserId("freeman");
        if (user == null) {
            user = new User("freeman");
            user.setLastName("Doe");
            user.setFirstName("J.");

            user  = userrepo.save(user);

        }

        List<ExpenseReport> a = new ArrayList<ExpenseReport>();
        for (int i = 0; i < 10; i++) {
            ExpenseReport er  = new ExpenseReport();
            er.setExpenseNumber("ER" + System.currentTimeMillis());
            er.setComment("a comment");
            er.setName("a name");
            er.setSubmittedBy(user);


            List<ExpenseEntry> list = new ArrayList<ExpenseEntry>();

            double amount = (Math.random()) + Math.random();

            list.add(new ExpenseEntry(p.toLite(),  amount, Currency.getInstance("EUR"), c1.toLite()));

            er.addToTotal(amount);

            amount = (Math.random()) + Math.random();

            list.add(new ExpenseEntry(p.toLite(),  amount,Currency.getInstance("USD"), c1.toLite()));
            er.addToTotal(amount);

            amount = (Math.random()) + Math.random();

            list.add(new ExpenseEntry(p.toLite(),  amount,Currency.getInstance("USD"), c1.toLite()));
            er.addToTotal(amount);


            er.setExpenses(list);


            a.add(er);      


        }

        try {

            ur1.save(a);
        } catch (Throwable t) {
            System.err.println(t.getMessage());
        }

        System.out.println(ur1.count());

    }

}

如您所见,我正在做一个小的“ for”只是为了将一些数据放入其中。

问题是,无论如何,我每个Main执行都只有一条记录。 (与旧的mongodb相比,这是一个改进,我只获得了一个记录,无法放多个)

这是费用类

package com.jaex.model;

import java.io.Serializable;
import java.util.List;

import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

    @Document(collection = "ExpenseReports")
    public class ExpenseReport implements Serializable {


    private static final long serialVersionUID = 2244814936573280668L;

    @Id
    private ObjectId id;

    @Indexed(unique = true)
    private String expenseNumber;

    private String name;
    private String comment;

    private double total;


    private User submittedBy;


    private List<ExpenseEntry> expenses;


    public ExpenseReport() {
        this.total = 0;
    }


    public String getExpenseNumber() {
        return expenseNumber;
    }


    public void setExpenseNumber(String expenseNumber) {
        this.expenseNumber = expenseNumber;
    }

    public String getName() {
        return name;
    }


    public String getComment() {
        return comment;
    }


    public User getSubmittedBy() {
        return submittedBy;
    }


    public List<ExpenseEntry> getExpenses() {
        return expenses;
    }



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


    public void setComment(String comment) {
        this.comment = comment;
    }


    public void setSubmittedBy(User submittedBy) {
        this.submittedBy = submittedBy;
    }


    public void setExpenses(List<ExpenseEntry> expenses) {
        this.expenses = expenses;
    }


    @Override
    public String toString() {
        return String.format("ExpenseReport [id= %s, expenseNumber=%s, name=%s, comment=%s, submittedBy=%s, expenses=%s]",
                getId(), expenseNumber, name, comment, submittedBy, expenses);
    }


    public double getTotal() {
        return total;
    }


    public void setTotal(double total) {
        this.total = total;
    }

    public void addToTotal(double total) {
        this.total = this.total + total;
    }


    public ObjectId getId() {
        return id;
    }


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




}

所有资料库

extends CrudRepository<T, ObjectId>

JDK: 1.8

MongoDB: MongoDB shell version: 3.2.4

Spring data: 1.9.1.RELEASE (org.springframework.data/spring-data-mongodb)

有什么帮助吗? 得到它了! 问题不是ER类,而是用户。

如果我使用Indexed注释不起作用,则不起作用。

现在我有两个问题:

  1. 为什么没有例外?
  2. 用户,如果您看一下主要内容,只需插入一次,然后反复使用....那么我的错误在哪里?

下面的代码类

package com.jaex.model;

import java.io.Serializable;

import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document (collection  = "Users")
public class User implements Serializable, Comparable<User>{
    private static final long serialVersionUID = 990052324161479791L;

    @Id
    private ObjectId id;

    @Indexed(unique = true, direction = IndexDirection.ASCENDING, useGeneratedName = true)
    private String userId;

    private String firstName;
    private String lastName;



    public User() {

    }

    public User(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public int compareTo(User o) {
        return o.getUserId().compareTo(userId);
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((userId == null) ? 0 : userId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (userId == null) {
            if (other.userId != null)
                return false;
        } else if (!userId.equals(other.userId))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return String.format("User [userId=%s]", userId);
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }



}

谢谢

forloop中的setExpenseNumber使用System.currentTimeInMillis,该速度仍然如此之快,以至于整个列表可能具有相同的ER号,并且您的文档需要唯一的signatureNumber。 为什么不尝试使用索引i作为后缀以确保其唯一性并检查是否可行?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM