繁体   English   中英

Google App Engine中的关系

[英]Relationships in Google App Engine

我只有一个星期的GAE / Java经验,并试图将旧版应用程序(使用PHP / MySQL开发)移植到GAE + JDO。 我现在在创建两个表(GAE中的种类)之间的关系时遇到了一个基本问题。

情况就是这样:我们有一个Users表,其中包含用户身份验证信息。 它还具有一个字段user_role ,用于存储role_id,该字段实际上是另一个表user_roles的外键。

从GAE的Entity-Relationship文档中,我了解到DataStore不支持外键关系,并通过改编docs中的Employee-ContactInfo示例设计了Users类。

当我执行该应用程序时,每次我在“ 用户”表中添加条目时,都会插入user_roles类型。 假设user_roles类型只有三个静态值。 但这是多余的值,因为我在Users中输入了更多记录。

我认为我缺少了一些琐碎的东西,但是由于我对数据存储的经验不足,所以无法弄清楚。 如果有人可以指导我解决这个问题,那就太好了。

这是代码:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Users {

        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Key key;

        @Persistent
        private String userName;

        @Persistent
        private String password;

        @Persistent
        private String salt;

        @Persistent
        private Date createdDate;

        @Persistent
        private Key createdBy;

        @Persistent
        private Date lastLogin;

        @Persistent
        private boolean status;

        @Persistent
        private String authKey;

        @Persistent(defaultFetchGroup="true")
        private SecurityRole securityRole;

        @Autowired
        SecurityRepository securityRepository ;

        public SecurityPrincipals(String userName, String password,SecurityRole securityRole,boolean status) {
                this.securityRole = securityRole;
                this.userName = userName;
                this.password = password;
                this.status = status;
        }

   //getters and setters
}

角色定义:

@PersistenceCapable(detachable="true")
public class SecurityRole {

        @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Key key;

        @Persistent
        private String securityRoleName;

        @Persistent
        private String securityRoleDescription;

        @Persistent
        private String securityRoleStatus;

        @Persistent
        private Date securityRoleCreatedDate;

        public SecurityRole(String securityRoleName, String securityRoleDescription, String securityRoleStatus,String securityBaseType)
        {
                this.securityRoleName = securityRoleName;
                this.securityRoleDescription = securityRoleDescription;
                this.securityRoleStatus = securityRoleStatus;
                this.securityBaseType = securityBaseType;
        }
// getters and setters
}

来自Controller的相关代码:

SecurityRole securityRole = securityRepository.getSecurityRole( securityRoleName);
users = new Users(userName,password,status,securityRole);
iUserRepository.save(employeeDetails);

这是getSecurityRole的定义:

public SecurityRole getSecurityRole(String securityRoleName)
        {
                      PersistenceManagerFactory pmf = this.jdoTemplate.getPersistenceManagerFactory();
                PersistenceManager pm = pmf.getPersistenceManager();
                try {
                        Query query = pm.newQuery( SecurityRole.class);
                        query.declareImports("import java.lang.String");
                        query.declareParameters("String securityRoleName");
                        query.setFilter("this.securityRoleName == securityRoleName");
                        List<SecurityRole> securityRoles = (List<SecurityRole>)query.execute(new String(securityRoleName));
                        SecurityRole temp = null;
                        for(SecurityRole securityRole: securityRoles)
                        {
                                temp = securityRole;
                        }
            return temp;
                }
                finally {
                        pm.close();
                }
        }

这是iUserRepository.save()的定义:

public void save(Users user) {
               jdoTemplate.makePersistent(companyDetails);
}

在Users类中,您已定义了属性

@Persistent(defaultFetchGroup="true")
private SecurityRole securityRole;

该语句在GAE数据存储区中创建一个“拥有的”关系,这意味着当您创建Users类的对象时,也会创建SecurityRole类的对象。

您需要的是一个可以按如下方式创建的无主关系:

@Persistent(defaultFetchGroup="true")
private Key securityRole;

这样,每次您创建Users类的实例时,都不会创建SecurityRole对象。 有关所有权和非所有权关系的更多信息,请访问http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM