0

これは非常に基本的な問題ですが、問題を解決/把握できないようですので、新鮮な目が助けてくれることを願っています.

ユーザー名とパスワードを持つモデル User があります。ユーザーがパスワードを更新できるようにしたいので、以下に示すように update() メソッドを追加しました。

public static void update(User user) throws UserException {
    User record = User.getById(user.id);
    if (null == record) {
        throw new UserException(BaseException.invalidRecordMessageException(User.class.getSimpleName()));
    }

    if (!StringUtils.equals(record.username, user.username)) {
        throw new UserException(BaseException.unmodifiableFieldMessageException(User.class.getSimpleName(), "username"));
    }
    validatePassword(user.password);
    saveUser(user);
}

そして、ここに私のsaveUser()があります:

private static void saveUser(User user) {
    user.password = encryptPassword(user.password);
    user.save();
    System.out.println("n: " + user.id);
    System.out.println("n: " + user.username);
    System.out.println("n: " + user.password);

    User r = User.getById(user.id);
    System.out.println("r: " + r.id);
    System.out.println("r: " + r.username);
    System.out.println("r: " + r.password);
}

機能が完全に動作していることを確認するテストを追加しました。

@Test
public void testUpdateUserPasswordWithValidPasswordShouldUpdateRecord() {
    try {
        User dummy = new User(DEFAULT_USERNAME, DEFAULT_RAW_PASSWORD);
        User.create(dummy);

        assertNotNull(dummy.id);
        User record = User.getById(dummy.id);
        assertEquals(DEFAULT_USERNAME, record.username);
        assertEquals(DEFAULT_RAW_PASSWORD, record.password);

        dummy.password = DEFAULT_RAW_PASSWORD + "_extra";
        User.update(dummy);

        User updatedRecord = User.getById(dummy.id);
        assertEquals(dummy.username, updatedRecord.username);
        assertEquals(dummy.password, updatedRecord.password);
    } catch (UserException ue) {
        fail("Test should not throw exception.");
    }
}

ただし、レコードが更新されていないように見えるため、テストは失敗しています。

Test UserTest.testUpdateUserPasswordWithValidPasswordShouldUpdateRecord failed: expected:<$uP3rsecretpassword[_extra]> but was:<$uP3rsecretpassword[]>

DEFAULT_PASSWORD = $uP3rsecretパスワード

以下は、すべての System.out.println() 呼び出しの出力です。

--- 初期作成 ---
n: 1

n:モー

n: $uP3rsecretpassword

r:1

r:モー

r: $uP3rsecretpassword

- - アップデート - -

n:1

n:モー

n: $uP3rsecretpassword_extra

r:1

r:モー

r: $uP3rsecretpassword

助けてくれてありがとう。

4

1 に答える 1

0

問題は次の行にあると思います。

    User record = User.getById(user.id);

Hibernateは、特定のIDの1つのオブジェクトのみを保持します。したがって、ここでは、オブジェクトに含まれている変更を、user現在DBにある(古い)状態で効果的に上書きしています。

あなたがそこで行っているチェックに関しては、あなたがあなた自身のコードを信頼していないので、とにかくそれらは少し不必要であるように思われます。

于 2012-08-26T19:45:32.447 に答える