0

一意性を強制したい文字列フィールド emailAddress を持つ User クラスがあります。利用可能な提案された解決策を機能させるのに苦労していたので、一意のフィールドを主キーとして持つ別のクラスを使用して、機能しているように見える次のプロセスを書きました。

動作しているように見えますが、(存在しない EmailAddress オブジェクトを取得しようとして) 何も正しくないときに意図的に例外を作成しているため、においがします。

特に複数の appengine インスタンス間で、この方法が確実に機能するかどうかについて、誰でもコメントできますか。

ありがとう。

まず、 User クラスがあります。

@PersistenceCapable
public class User {
  public User(String emailAddress, String otherData) {
    this.emailAddress = emailAddress;
    this.otherData = otherData;
  }

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

  @Persistent
  private String emailAddress;

  @Persistent
  private String otherData;
}

次に、電子メール アドレスを主キーとして使用して、EmailAddress クラスを作成します。

@PersistenceCapable
public class EmailAddress {
  public EmailAddress(String emailAddress) {
    this.emailAddress = emailAddress;
  }

  @PrimaryKey
  @Persistent
  private String emailAddress;
}

これらのクラスの使用法は次のとおりです。

public class UserManager {

  public User createUser(String email, String otherData) {
    User user = new User(emailAddress, otherData);
    EmailAddress emailAddress = new EmailAddress(email);

    PersistenceManager pm = PMF.get().getPersistenceManager();
    Transaction tx = pm.currentTransaction();

    User persistedUser = null;  

    try {
      tx.begin();
      EmailAddress testEmailAddress = null;
      try {
        testEmailAddress = pm.getObjectById(EmailAddress.class, email);
      } catch (Exception e) {
        //
      }
      if (null != testEmailAddress) {
        throw new RuntimeException("That email address already has an account");
      }
      pm.makePersistent(emailAddress);
      persistedUser  = pm.makePersistent(user);
      txn.commit();
      return persistedUser;
    } finally {
      if (txn.isActive()) {
        txn.rollback();
      }
      pm.close();
    }
  }

  ...

}
4

0 に答える 0