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

Playframework Model.find返回相同的对象引用,playframework,playframework-1.x,Playframework,Playframework 1.x,我只是在创建一个设置页面,用户可以在其中更改其用户名。奇怪的是,我使用相同的finder方法在主视图和窗体中显示它,但对象之间没有关联 副作用是现在,如果我不输入用户名并单击保存。两个对象都将更新。以及视图中错误的显示 我只想在表格中使用一个单独的模型。我做错了什么?我认为调用“Model.find”每次都会返回一个对象的不同引用,即使它在数据库中是同一行。play在这里进行智能缓存吗 改变表单中的用户就意味着改变视图中所有其他相同的用户对象,这一点非常重要 呈现创建/编辑页面的操作: publ

我只是在创建一个设置页面,用户可以在其中更改其用户名。奇怪的是,我使用相同的finder方法在主视图和窗体中显示它,但对象之间没有关联

副作用是现在,如果我不输入用户名并单击保存。两个对象都将更新。以及视图中错误的显示

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

改变表单中的用户就意味着改变视图中所有其他相同的用户对象,这一点非常重要

呈现创建/编辑页面的操作:

public static void index(){
        User appUser = User.findUser(SecureSocial.getCurrentUser().id);
        render(appUser);
 }
我的视图(显示当前登录的用户名)

我的模型:

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

谢谢

Hibernate正在支持您的持久存储。对于一个事务中的一个持久(逻辑)对象,Hibernate将只创建并保留它的一个实例,原因有很多。因此,你所描述的行为实际上是意料之中的

有关更多信息,请参阅

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

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

User.em().detach(用户)

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