2016-04-11 2 views
0

Ich bin ziemlich neu in MongoDB und Spring Data, ich mache etwas Code, um meine Fähigkeiten zu verbessern.mongodb spring data save

Ich denke, mir geht es gut, aber ich habe ein Problem (ein seltsames).

Ich habe ein kleines Beispiel, lass mich sagen, anstelle von klassischen Hallo Wort, ich kodiere ein kleines Spesenberichtswerkzeug.

Dies ist die TestMain App

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()); 

    } 

} 

Wie Sie ich mache ein kleines „für“ nur im Inneren einige Daten setzen sehen.

Das Problem ist, dass ich sowieso nur einen Datensatz jede Main-Ausführung bekam. (Dies wurde eine mit dem alten mongodb verbessert Ich habe nur einen Datensatz, auf keinen Fall mehr als ein setzen)

dies die Kostenklasse

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




} 

Alle Repositories

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) 

Jede Hilfe ? Verstanden! Das Problem ist nicht mit ER-Klasse, sondern mit Benutzer.

Wenn ich die indizierte Annotation nicht funktioniert, funktioniert nicht.

Jetzt habe ich zwei Fragen:

  1. Warum gibt es keine Ausnahme?
  2. Der Benutzer, wenn Sie einen Blick auf die wichtigsten, wird nur einmal eingefügt, dann immer und immer wieder verwendet .... so wo ist mein Fehler?

Unter dem Codeklasse

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



} 

Dank

+0

Fügen Sie das Ende Ihrer Ausführung hinzu Sie sehen nur die 123456 in der Project-Sammlung? – Koitoer

+0

Sie sollten erwägen, von MongoRepository zu erweitern http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/MongoRepository.html#save-java.lang.Iterable - – Koitoer

+0

Ich hatte auch versucht mit Standard-MongoTemplate-Betrieb, gleich .. das Problem ist nicht mit Projekt, sondern mit Aufwand – FreeMan

Antwort

0

setExpenseNumber in Ihrem forloop verwendet System.currentTimeInMillis die immer noch so schnell ist, dass es wahrscheinlich die gleiche ER-Nummer für die ganze Liste haben könnte und Ihre Das Dokument erwartet eine eindeutige Ausgabennummer. Warum versuchen Sie nicht, den Index i als Suffix zu verwenden, um sicher zu sein, dass es eindeutig ist, und prüfen Sie, ob das funktioniert?

+0

Ich habe ein paar mehr Test gemacht, siehe oben. hat nichts mit dem eindeutigen Schlüssel zu tun :-( – FreeMan

+0

Ist Ihr Projekt teilbar? Ich kann es von github auschecken, um Ihnen beim Debuggen zu helfen, es wird viel einfacher sein. – vine

+0

Ciao rebe, nein ist nicht gerade ein Projekt :-) Ich bin Versuche zu lernen. Die obigen Klassen sind "das Projekt" :) – FreeMan

Verwandte Themen