Pao*_*one 2 java dependency-injection jsf-2 jpa-2.0
我在会话范围内有一个JSF托管bean,它包含要跟踪的实体,例如,经过身份验证的用户:
@ManagedBean
@SessionScoped
public class LoginController implements Serializable {
User user;
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
在另一个bean中,我必须注入用户以使用它来检索与之关联的角色列表,如下所示:
@ManagedBean
@ViewScoped
public class AnotherController implements Serializable {
List<Role> roles;
@ManagedProperty(value="#{loginController.user}")
User user;
public someMethod() {
/* Some stuff that insert other roles into database, referring the user as owner */
roles = user.getRolesList();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用ajax更新页面someMethod,roles列表仍然无法重新加载.如果我em.refresh(user)在user.getRolesList收到此错误之前插入:
Can not refresh not managed object: model.User[ id=1 ].
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我理解这个吗?如果注入另一个bean,为什么会话范围实体不会被管理?我怎样才能解决这个问题?谢谢.
为了使权限能够刷新,需要对其进行管理,但您已经知道了.要使它成为马来人,它必须是
前两个选项需要交易.
由于既不是@ManagedBean也不@ViewScoped暗示任何类型的事务管理,这些bean中的实体将始终被分离,因此您遇到的行为是预期的JPA行为.
对于前两个选项,您可以将请求传递给后端中启用事务的EJB,该EJB将合并和更新实体或返回刚刚获取的实体.如果您没有使用Java EE应用程序服务器,则可以使用UserTransaction.
对于第三个选项,您可以使用扩展的持久性上下文,该上下文在每次事务后都不会关闭,因此实体将跨事务边界进行管理.
编辑修复此问题的最简单方法,使用UserTransaction和假设依赖注入.
@Inject
UserTransaction tx;
//merging and refreshing
tx.begin();
User managedUser = em.merge(user);
em.refresh(managedUser);
tx.commit();
user = managedUser;
//refetching
tx.begin();
user = em.find(User.class, user.getId);
tx.commit();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |