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.
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