我只有一周的GAE / Java经验,并尝试将遗留应用程序(使用PHP / MySQL开发)移植到GAE + JDO。我现在在创建两个表(GAE中的种类)之间的关系时遇到了一个基本问题。
所以情况就是这样: 我们有一个用户表,其中包含用户身份验证信息。它还有一个 user_role 字段,用于存储role_id,它实际上是另一个表 user_roles 的外键。
从GAE中的Entity-Relationship文档中,我了解到DataStore不支持外键关系,并通过调整docs中的Employee-ContactInfo示例来设计Users类。
当我执行应用程序时,每次在用户表中添加条目时都会插入 user_roles 类型。 user_roles类应该只有三个静态值。但是,当我在用户中输入更多记录时,这具有多余的值。
我认为我遗漏了一些非常微不足道的东西,但由于我对数据存储的经验不足,我无法弄明白。如果有人可以指导我解决这个问题,那将是非常好的。
以下是代码:
@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);
}
答案 0 :(得分:4)
在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
希望这有帮助!