如何在java Google App Engine中强制使用唯一字段值

时间:2009-10-13 21:41:05

标签: java google-app-engine

我试图找出如何在唯一ID之外的字段中强制执行唯一性。

示例:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements IsSerializable {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name; 

    @Persistent
    private String email; // <= I want this to be unique as well
}

在上面的示例中,如何在整个数据库中强制实施电子邮件值的唯一性?

丹尼尔

3 个答案:

答案 0 :(得分:11)

目前没有使用应用引擎数据存储区的内置方式。例如,请参阅this datanculeus ticket。 (请注意,JDO本身确实有一个@unique注释。)

“伪造”的一种方法是使用电子邮件本身作为密钥创建另一种名为Email的类/类,并将用户的密钥作为属性。由于电子邮件现在是一个密钥,它将被强制为唯一。只需确保您的电子邮件实体是顶级实体,而不是其关联用户的子级。您还必须密切关注您对交易的使用,以确保如果两个用户尝试在同一时间使用同一封电子邮件,则不要让重复的内容泄漏。

答案 1 :(得分:6)

我编写了一个类来处理向App Engine实体添加唯一字段的所有功能。请随意使用它。

在项目中插入此类,只需添加get和update方法,并提供实体名称,字段名称和唯一字段值

源代码可在此处获取:

http://code.google.com/p/appengine-uniquefields/

答案 2 :(得分:1)

目前尚不支持此功能。如果您决定在项目中编写DAO层(不是一个坏主意),您可以执行一个查询,以测试MyObjectDAO.addMyObject(o)中您想要的任何限制,这将导致MySuperDuplicateValueException。