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

Posted

技术标签:

【中文标题】Model.find 返回相同的对象引用【英文标题】:Model.find returns same object reference 【发布时间】:2012-07-27 08:00:58 【问题描述】:

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

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

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

这很烦人,因为更改表单中的用户意味着更改视图中所有其他相同的用户对象。

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

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】:

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

有关更多信息,请参阅http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-overview。

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

所以你可以改变你的控制器函数来分离被编辑的对象:

User.em().detach(user);

【讨论】:

以上是关于Model.find 返回相同的对象引用的主要内容,如果未能解决你的问题,请参考以下文章

Java中不同对象调用该实例方法返回值是同一个地址空间吗?

Jquery 的构造函数

C++ 类返回具有新地址的引用

java中为对象返回一个引用

返回对象和返回引用

关于java里返回对象的引用