保存更新的现场游戏框架

时间:2012-08-26 19:04:38

标签: java playframework playframework-1.x

这是一个非常基本的问题,但我似乎无法解决/弄清楚问题,所以希望一些新鲜的眼睛可以提供帮助。

我有一个模型用户,其中包含用户名和密码。我想允许用户更新他们的密码,所以我添加了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 = $ uP3rsecretpassword

以下是所有System.out.println()调用的输出:

---初始创造---
n:1

n:moo

n:$ uP3rsecretpassword

r:1

r:moo

r:$ uP3rsecretpassword

---更新---

n:1

n:moo

n:$ uP3rsecretpassword_extra

r:1

r:moo

r:$ uP3rsecretpassword

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为问题出在这一行:

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

Hibernate只保留某个id的一个对象。所以,在这里,您实际上覆盖了对象user中包含的更改,其中包含当前在DB中的(旧)状态。

至于你在那里做的检查,无论如何它们似乎有点多余,因为你不相信自己的代码。