gpt4 book ai didi

java - Google App Engine 中的关系

转载 作者:行者123 更新时间:2023-12-01 19:14:42 25 4
gpt4 key购买 nike

我在 GAE/Java 方面只有一周的经验,并尝试将遗留应用程序(使用 PHP/MySQL 开发)移植到 GAE+JDO。我现在遇到了在两个表(GAE 中的类型)之间创建关系的基本问题。

情况如下:我们有一个用户表,其中保存用户身份验证信息。它还有一个存储role_id的字段user_role,它实际上是另一个表user_roles的外键。

从 GAE 中的实体关系文档中,我了解到 DataStore 不支持外键关系,并通过调整文档中的 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);
}

最佳答案

在 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

希望这有帮助!

关于java - Google App Engine 中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7241982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com