2017-08-09 2 views
0

Also habe ich angefangen mit Morphia zu arbeiten und ich stoße auf ein seltsames Problem.Morphia (MongoDB) Datenspeicher "get" gibt null zurück

Hier ist meine Entitätsklasse

@Entity("movies") 
@Indexes(@Index(value = "Name", fields = @Field("Name"))) 
@Converters(LocalDateConverter.class) 
public class MovieDetails implements Serializable 
{ 
    @Id 
    public String Id; 
    public String Name; 
    public String Description; 
    public String ImageName; 
    public LocalDate ReleaseDate; 
    public String Director; 
    public int Duration; 
    public String Genres; 
    public String Actors; 

    public MovieDetails() 
    { 

    } 

    public MovieDetails(String id, String name, String description, String imageName, String director, String actors, LocalDate releaseDate, String genres, int duration) 
    { 
     this (name, description, imageName, director, actors, releaseDate, genres, duration); 
     Id = id; 
    } 

    public MovieDetails(String name, String description, String imageName, String director, String actors, LocalDate releaseDate, String genres, int duration) 
    { 
     Name = name; 
     Description = description; 
     ImageName = imageName; 
     Director = director; 
     Actors = actors; 
     ReleaseDate = releaseDate; 
     Genres = genres; 
     Duration = duration; 
    } 
} 

Hier ist mein kleiner Test:

final Morphia morphia = new Morphia(); 

// tell Morphia where to find your classes 
// can be called multiple times with different packages or classes 
morphia.mapPackage("nimrodpasha.cinema.objects"); 

// create the Datastore connecting to the default port on the local host 
final Datastore datastore = 
     morphia.createDatastore(SingleMongoClient.getInstance().getClient(), 
           Constants.DB.TICKET_DATABASE); 
datastore.ensureIndexes(); 

    //region new movie 
    MovieDetails movie = new MovieDetails("The Mask", "Stanley Ipkiss (Jim Carrey) is a bank clerk that is an incredibly nice man. Unfortunately," + 
      " he is too nice for his own good and is a pushover when it comes to confrontations. After one of the worst days of his life, he finds a mask that depicts Loki, " + 
      "the Norse night god of mischief. Now, when he puts it on, he becomes his inner, self: a cartoon romantic wild man. However, a small time crime boss, Dorian Tyrel (Peter Greene), " + 
      "comes across this character dubbed The Mask by the media. After Ipkiss's alter ego indirectly kills his friend in crime," + 
      " Tyrel now wants this green-faced goon destroyed.", 
              "MASK.jpg", "Chuck Russell", "Jim Carrey as Stanley Ipkiss/The Mask,Cameron Diaz as Tina Carlyle,Amy Yasbeck as Peggy Brandt,Joely Fisher as Maggie", new LocalDate(1994, 2, 1), "Action,Comedy,CrimeAction,Family,Fantasy", 88); 
    //endregion 

// Clearing the db first 
datastore.delete(datastore.createQuery(MovieDetails.class)); 

// Saving a new entity and getting the result saved id 
String id = (String) datastore.save(movie).getId(); 

// This returns as null 
MovieDetails movieRetrieved = datastore.get(MovieDetails.class, id); 

// This returns with one item 
List<MovieDetails> allMovies = datastore.createQuery(MovieDetails.class).asList(); 

Wenn ich

datastore.get (MovieDetails.class, id)

ich null

Wenn ich:

datastore.createQuery (MovieDetails.class) .asList();

Ich sehe meinen Film in der DB, mit der ID in der Get-Funktion verwendet.

Erprobt die ID in vielen Variationen ... toString(), ObjectId (id), Key (Der Wert aus dem gespeicherten Ergebnis zurückgegeben).

Die Id in der DB (mit Mongo Explorer betrachtet) als etwas nicht zeigen, die nicht String (blau gefärbt), verdächtig: Mongo Explorer item picture

Irgendwelche Ideen?

Edit: * die Id ist in der Tat eine Zeichenfolge, die Gussarbeiten und es wurde unter Verwendung der Uhr überprüft + Instanceof Edit 2: * Irgendwie die Besetzung von ObjectId zu String übergeben und die Id ist nicht wirklich ein Zeichenfolge.

+0

prüfen, was dieser zurückkehrt und statt es zu bespannen Gießen, ein Objekt dieser Art machen. datastore.save (Film) .getId() Es sieht aus wie es Null für eine ClassCastException in Java zurückgibt.Gibt es Protokollierung, die Sie betrachten oder debuggen können Sie aktivieren? –

+0

@CalvinTaylor Beim Hinzufügen der ID zum Beobachten (ohne Casting) lautet das Ergebnis: "598b70468a141e56ac9e9203" und der innere Wert ist als char [] markiert. ID instanceof String gibt auch "True" zurück. – Nimig

+0

@CalvinTaylor in Bezug auf Ihre Bearbeitung: getId() gibt keine Null zurück und/oder erhalten Sie eine ClassCastException, Die zurückgegebene ID stimmt mit der in der Datenbank überein. Ich habe die Code-Schritte getrennt, bevor sie wieder gruppiert wurden, erst nachdem die ID korrekt zurückgegeben wurde, wurde db korrekt aktualisiert und die ID ist eine Zeichenfolge. – Nimig

Antwort

0

Nach Nic Cottrell (Danke!) Antwort Ich hatte eine neue Perspektive auf das Problem. Da mein @ Id-Feld nicht von mir zugewiesen wurde, wurde es automatisch in der DB als ObjectId zugewiesen. Da ich immer noch String verwenden möchte, habe ich einfach das @Id Feld bei der Objekterstellung zugewiesen.

Id = ObjectId.get().toString(); 

fand die Lösung auf: MongoDB/Morphia saves technical id as ObjectId although it's a String in Java

0

Ich würde Ihr I-Feld von String in ein BSON ObjectId-Feld ändern, das MongoDB beim Speichern automatisch zuweisen wird. Wenn Sie dann Ihren Aufruf mit der ObjectId als Parameter ausführen, sollte es funktionieren. Die Verwendung von ObjectId als Ihr ID-Feld wird bei Mongo dringend empfohlen.

Ich vermute, dass Morphia versucht, eine ObjectId in Ihrem String Id-Feld Marshall und es gibt einen kleinen Fehler irgendwo. Ich würde versuchen, datastore.get(Example.class, new ObjectId(id) zu nennen).

+0

Ich habe neue ObjectId (ID) vor und es hat nicht funktioniert, aber ... jetzt tut es:/ Ihre Lösung funktioniert! Anscheinend erstellt Morphia die _id als ObjectId, obwohl mein String als Id markiert wurde! Entweder dies oder er ignoriert einfach den Typ ... der andere Weg funktioniert, Morphia weiß, die ID von der DB in meine Zeichenfolge zu setzen. – Nimig