Model.find返回相同的对象引用

时间:2012-07-27 08:00:59

标签: playframework playframework-1.x

我只是创建一个用户可以更改其用户名的设置页面。奇怪的是我使用相同的查找器方法在主视图和表单中显示它但对象彼此不相关。

现在是副作用,如果我不输入用户名并点击保存。两个对象都已更新。同样在视图中显示错误。

我只想在表单中使用单独的模型。我在这做错了什么?我认为调用“Model.find”每次都会返回一个对象的不同引用,即使它在db中是同一行。玩游戏在这里做一些智能缓存吗?

因为在表单中更改用户意味着更改视图中的所有其他相同用户对象,这非常令人讨厌。

渲染创建/编辑页面的操作:

public static void index(){
        User appUser = User.findUser(SecureSocial.getCurrentUser().id);
        render(appUser);
 }

我的观点(显示当前登录的用户名)

${models.User.findUser(user.id).username}

我的模特:

public static User findUser(UserId userId){
        User user = User.find("externalId = ? and provider = ?", userId.id, userId.provider.name()).first();
        return user;
}

由于

1 个答案:

答案 0 :(得分:0)

Hibernate支持你的持久存储。对于一个Transaction中的一个持久(逻辑)对象,Hibernate将仅出于多种原因创建并保留它的一个实例。所以你描述的行为实际上是预期的。

有关详情,请参阅http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-overview

要同时拥有两个对象实例,必须分离(即用Hibernate的用法删除指向DB对象的链接)。通常,您分离已编辑的对象,并让对象单独进行渲染。

因此,您可以更改控制器功能以分离编辑的对象:

User.em().detach(user);