保存更新的野外游戏框架

Posted

技术标签:

【中文标题】保存更新的野外游戏框架【英文标题】:saving updated field play framework 【发布时间】:2012-08-26 19:04:37 【问题描述】:

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

我有一个具有用户名和密码的模型用户。我想允许用户更新他们的密码,所以我添加了 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: 哞

n: $uP3rsecretpassword

r: 1

r: 哞哞

r: $uP3rsecretpassword

---更新---

n: 1

n: 哞

n: $uP3rsecretpassword_extra

r: 1

r: 哞哞

r: $uP3rsecretpassword

提前感谢任何帮助。

【问题讨论】:

保存实现在哪里? 【参考方案1】:

我认为问题出在这一行:

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

Hibernate 只保留一个特定 id 的 one 对象。因此,在这里,您实际上是用数据库中当前的(旧)状态覆盖了对象 user 中包含的更改。

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

【讨论】:

以上是关于保存更新的野外游戏框架的主要内容,如果未能解决你的问题,请参考以下文章

[游戏更新]游戏更新框架的设计

游戏开发框架自制Unity通用游戏框架UnityXFramework,详细教程(Unity3D技能树 | tolua | 框架 | 热更新)

游戏开发框架自制Unity通用游戏框架UnityXFramework,详细教程(Unity3D技能树 | tolua | 框架 | 热更新)

: 《江湖X》开发笔谈 - 热更新框架

调用“更新”后 XNA 游戏堆栈溢出错误

android游戏初步 01 游戏框架