2016-05-24 9 views
0

Ich habe eine ComposedIdKey-Klasse, die ich zum Erstellen eines zusammengesetzten Schlüssels für die Customer-Klasse verwenden. Ich kann dieses Objekt in Hbase mit zusammengesetzten Schlüssel erfolgreich einfügen. Allerdings, wenn ich versuchen, das Objekt zuzugreifen, die folgende Meldung erhalten:DataNucleus + JDO: Abrufen eines Objekts mit zusammengesetztem Schlüssel (Fehler: NoSuchElementException)

java.util.NoSuchElementException 
     at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) 
     at DN_Schema.ComposedIdKey.<init>(ComposedIdKey.java:26) 
     at DN_Schema.Customer_JDO3.dnNewObjectIdInstance(Customer_JDO3.java) 
     at org.datanucleus.enhancer.EnhancementHelper.newObjectIdInstance(EnhancementHelper.java:221) 
     at org.datanucleus.identity.IdentityManagerImpl.getApplicationId(IdentityManagerImpl.java:479) 
     at org.datanucleus.ExecutionContextImpl.newObjectId(ExecutionContextImpl.java:3729) 
     at org.datanucleus.api.jdo.JDOPersistenceManager.newObjectIdInstance(JDOPersistenceManager.java:1595) 
     at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1723) 
     at Performance.DataNucleusPerfo.Read_Hbase(DataNucleusPerfo.java:109) 

die compososedIdKey

public class ComposedIdKey implements Serializable 
{ 
    public String firstName; 
    public String lastName; 
    public String dateOfBirth; 

    public ComposedIdKey() 
    { 
    } 

    /** 
    * Constructor accepting same input as generated by toString(). 
    */ 
    public ComposedIdKey(String value) 
    { 
     StringTokenizer token = new StringTokenizer (value, "::"); 
     token.nextToken();    // className 
     this.firstName = token.nextToken(); // field1 
     this.lastName = token.nextToken(); // field2l 
     this.dateOfBirth = token.nextToken(); // filed3 
    } 

    public boolean equals(Object obj) 
    { 
     if (obj == this) 
     { 
      return true; 
     } 
     if (!(obj instanceof ComposedIdKey)) 
     { 
      return false; 
     } 
     ComposedIdKey c = (ComposedIdKey)obj; 

     return firstName.equals(c.firstName) && lastName.equals(c.lastName) && dateOfBirth.equals(c.dateOfBirth); 
    } 

    public int hashCode() 
    { 
     return this.firstName.hashCode()^this.lastName.hashCode()^this.dateOfBirth.hashCode() ; 
    } 

    public String toString() 
    { 
     // Give output expected by String constructor 
     return this.getClass().getName() + "::" + this.firstName + "::" + this.lastName + "::" + this.dateOfBirth; 
    } 
} 

Der Code, den ich verwende, das Objekt zu erhalten:

Transaction tx = pm.currentTransaction(); 
     System.out.println("Retrieving Customer"); 
     Customer_JDO3 teste = null; 
    try 
      { 
       tx.begin(); 
       teste = pm.getObjectById(Customer_JDO3.class,"10-10-10DataNucleus"); 

Der Zeilenschlüssel in Hbase wird angezeigt 10-10-10DataNucleus

Was kann ich falsch machen? Danke

+1

der Fehler wird von Ihrem Code –

Antwort

2

Ich denke, dass Sie versuchen, den Eintrag des Ctor mit "::" zu teilen, aber der Eintrag enthält solche Zeichen nicht.

+0

geworfen Dank @mvera, Das war dies und fehlende fügen Sie den Namen der Klasse. Außerdem muss die Reihenfolge entsprechend dem zurückgegebenen String in Class ComposedIdKey sein. "ComposedIdKey :: Data :: Nucleus :: 10-10-10" –

Verwandte Themen