appengine数据存储区中的键和唯一行

时间:2010-01-11 22:31:51

标签: google-app-engine primary-key google-cloud-datastore

我仍然很擅长使用java和google appengine数据存储区。

我可以将数据放入数据存储区并将其从数据存储区中取出,我正在尝试将其设置为无法输入两次用户。 由于数据存储区中没有唯一索引,因此我将用户电子邮件地址的哈希值设置为主键。

奇怪的是,当我多次输入相同的数据时,它被输入数据存储区(我认为它会返回错误,或者什么都不做)。

因此,当我将我的emailhash设置为'2'进行测试,然后多次运行插入脚本,并且查询WHERE _emailHash ='2'时,我得到3个结果。

这是我定义用户的类。

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

Google文档说明了以下内容

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

有没有更好的方法来保证唯一身份?或者我必须在每次插入之前检查值是否存在?

-------------------------- UPDATE -------------------- -------------------------- 根据Dmitri的回应,我正在混合JPA和JDO(或者至少在两者之间混淆)。现在我已经解决了这个问题,我的哈希电子邮件定义看起来像这样

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

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

不幸的是,在尝试使用

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

 $pm->persist($user);

我收到以下错误

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

到目前为止,我的搜索返回了一些关于指定键名的内容,但我还没有找到解决方案。

2 个答案:

答案 0 :(得分:1)

您所指的文档是关于JDO的,而您的代码似乎是使用JPA,其中@Id与@PrimaryKey在JDO中扮演的角色相同

答案 1 :(得分:0)

您可以使用键来检索数据:

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

Key k = KeyFactory.createKey(user.class.getSimpleName(), "Alfred.Smith@example.com");

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

来源:appengine docs