一意性を強制したい文字列フィールド 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();
}
}
...
}