У меня всего лишь недельный опыт работы с GAE / Java и я пытаюсь перенести устаревшее приложение (разработанное с использованием PHP / MySQL) на GAE + JDO. Теперь я застрял с основной проблемой при создании отношений между двумя таблицами (виды в GAE).
Итак, вот случай:
У нас есть таблица Users , которая содержит информацию для аутентификации пользователя. Он также имеет поле user_role , в котором хранится role_id, который на самом деле является внешним ключом другой таблицы user_roles .
Из документации Entity-Relationship в GAE я понимаю, что DataStore не поддерживает отношения с внешним ключом и разработал класс Users, адаптировав пример Employee-ContactInfo в документации.
Когда я выполнял приложение, вид user_roles вставляется каждый раз, когда я добавляю запись в таблицу Users . Предполагается, что вид 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
}
Соответствующий код от контроллера:
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);
}