2016-04-11 27 views
0

我对MongoDB和Spring Data很新,我正在做一些代码来提高我的技能。mongodb弹簧数据保存

我认为我做得很好,但我有一个问题(一个奇怪的)。

我有一个小例子,让我说,而不是经典的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()); 

    } 

} 

正如你可以看到我在做一个小“为”只是将一些数据内。

问题是无论如何,我每次执行主要执行时都只有一条记录。 (这是一个与老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) 

任何帮助? Got it! 问题不在于ER类,而在于用户。

如果我使用索引注释不起作用,没有工作。

现在我两个问题:

  1. 为什么没有异常?
  2. 用户如果你看看主,只是插入一次,然后反复使用....所以我的错误在哪里?在for循环

下面的代码类

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; 
    } 



} 

感谢

+0

添加执行结束时,您只能看到Project集合中的123456? – Koitoer

+0

您应该考虑从MongoRepository中扩展http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/MongoRepository.html#save-java.lang.Iterable - – Koitoer

+0

我也尝试过使用标准的MongoTemplate操作,同样..问题不在Project中,但费用为 – FreeMan

回答

0

setExpenseNumber使用System.currentTimeInMillis这仍然是如此之快,很可能对整个列表和你相同数量的ER文档需要唯一的费用编号。为什么不尝试使用索引作为后缀来确保它的独特性并检查它是否有效?

+0

我已经做了一些更多的测试,参见上文。与独特的关键字无关:-( – FreeMan

+0

您的项目是否可以共享?我可以从github上查看它以帮助您进行调试,这将会轻松很多。 – vine

+0

Ciao vine,no不完全是项目:-)我是试图学习。上面的类是“该项目”:) – FreeMan