1

Je suis encore relativement nouveau pour travailler avec java et le datastore google appengine.clés et lignes uniques dans la banque de données appengine

Je peux mettre des données et les sortir du magasin de données, et j'essaye de faire en sorte qu'un utilisateur ne puisse pas être entré deux fois. Comme il n'existe pas d'index unique sur la banque de données, je définis un hachage de l'adresse e-mail de l'utilisateur en tant que clé primaire. Bizarrement, lorsque j'entre plusieurs fois les mêmes données, il est entré dans le magasin de données (ce qui, selon moi, aurait renvoyé une erreur, ou rien fait). Donc, quand je mets mon emailhash à '2' pour le test, puis que j'exécute le script d'insertion plusieurs fois, et la requête WHERE _emailHash = '2', j'obtiens 3 résultats.

Voici la classe dans laquelle je définis l'utilisateur.

 
@Entity 
public class user 
{ 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long _uid; 

@PrimaryKey 
private String _emailHash; 

private String _firstName; 

private String _lastName; 

private String _email; 

private String _password; 

public Long getUid() 
{ 
    return _uid; 
} 

public String getEmailHash(){ 
    return _emailHash; 
} 
public void setEmailHash(String emailHash) 
{ 
    _emailHash = emailHash; 
} 

public String getFirstName() 
{ 
    return _firstName; 
} 
public void setFirstName(String firstName) 
{ 
    _firstName = firstName; 
} 
public String getLastName() 
{ 
    return _lastName; 
} 
public void setLastName(String lastName) 
{ 
    _lastName = lastName; 
} 

public String getEmail() 
{ 
    return _email; 
} 
public void setEmail(String email) 
{ 
    _email = email; 
} 
public String getPassword() 
{ 
    return _password; 
} 
public void setPassword(String password) 
{ 
    _password = password; 
} 
} 

La documentation Google indique que les éléments suivants

 
an entity ID ("key name") provided by the application when the object is created. Use this for objects without entity group parents whose IDs should be provided by the application. The application sets this field to the desired ID prior to saving. 
import javax.jdo.annotations.PrimaryKey; 

// ... 
    @PrimaryKey 
    private String name; 

à http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html

Y at-il une meilleure façon de garantir visiteurs uniques? Ou dois-je vérifier si la valeur existe à chaque fois avant de l'insérer?

-------------------------- MISE À JOUR ------------------- --------------------------- Selon la réponse de Dmitri, je mixais JPA et JDO (ou au moins se confondre entre les deux). Maintenant que j'ai que réglé, ma définition email hachée ressemble à ceci

 
@Id 
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
private String _emailHash; 

@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long _uid; 

Malheureusement lorsque vous essayez de créer un utilisateur avec

 
$pm = EMF::createEntityManager(); 
$user = new user(); 
$user->setEmailHash('5'); 
$user->setFirstName('test5'); 
$user->setLastName('test5'); 
$user->setEmail('test5'); 

$pm->persist($user); 

Je reçois l'erreur suivante

 
Invalid primary key for com.nextweeq.scheduler.user. The primary key field is an encoded String but an unencoded value has been provided 

Jusqu'ici mes recherches retournent quelque chose sur la spécification du nom de clé, mais je n'ai pas encore trouvé la solution pour le moment.

Répondre

1

Documentation dont vous parlez est de JDO, alors que votre code semble utiliser JPA où @Id joue le même rôle que joue dans @PrimaryKey JDO

+1

Merci Dmitri, qui peut avoir été la première question, mais maintenant je reçois des erreurs liées à l'utilisation de la « entité correspondante dans le datastore » ne pas avoir un nom, que je ne suis pas sûr Je comprends parfaitement. – pedalpete

0

Vous pouvez utiliser les touches retrive les données:

import com.google.appengine.api.datastore.Key; 
import com.google.appengine.api.datastore.KeyFactory; 

Key k = KeyFactory.createKey(user.class.getSimpleName(), "[email protected]"); 

PersistenceManager pm = PMF.get().getPersistenceManager(); 
user usr = pm.getObjectById(user.class, k); 

Source: appengine docs

+0

Je ne suis pas sûr de ce que vous obtenez à Kristian. Comment utiliser une clé pour extraire des données liées à l'utilisation de données en tant que clé? J'essaie de définir les données de l'utilisateur comme une clé, pas récupérer les données basées sur une clé. – pedalpete

+0

De la même manière que cela a été retrival peut être utilisé comme une clé. Légende k = KeyFactory.createKey (user.class.getSimpleName(), "[email protected]" Citation de la documentation google: " Les clés peuvent être converties vers et à partir d'une représentation sous forme de chaîne à l'aide des méthodes keyToString() et stringToKey() de la classe KeyFactory, respectivement. (Notez que cela est différent de la méthode toString() de la classe Key, qui renvoie une valeur lisible par l'utilisateur et adaptée au débogage.) " –

Questions connexes