Отношения в Google App Engine - PullRequest
       8

Отношения в Google App Engine

0 голосов
/ 30 августа 2011

У меня всего лишь недельный опыт работы с 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);
}

1 Ответ

4 голосов
/ 01 сентября 2011

В классе Users вы определили свойство

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

. Этот оператор создает «собственное» отношение в хранилище данных GAE, что означает, что при создании объекта класса Users объекткласса SecurityRole также будут созданы.

То, что вам нужно, - это неизвестное отношение, которое можно создать следующим образом:

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

Таким образом, объект SecurityRole не создаетсякаждый раз, когда вы создаете экземпляр класса Users.Для получения дополнительной информации о принадлежащих и не принадлежащих вам отношениях взгляните на http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html

Надеюсь, это поможет!

...