我正在尝试比较两个相同的对象。当页面首次加载时,它们是相等的,但是当我第二次刷新页面时,尽管数据或对象没有变化,但它们并不相等。
我在做什么。
我有一个CurrentUser
obj,我在登录时存储在用户会话中。我使用currentUser
与表单的assignedUser
进行比较。如果currentUser.equals(pr.getAssignedUser())
,那么我启用访问权限。 AssignedUser
是对CurrentUser
的hibernate变量引用。如果我从我的等于覆盖中删除getClass() != obj.getClass
并仅使用属性比较,一切正常。
最让我担心的是它适用于第一次访问,但不会在页面刷新时使用。在不知道发生了什么的情况下,我担心内存泄漏。
有人知道这里会发生什么吗?
CurrentUserServiceImpl.class
@Scope(ScopeConstants.PERTHREAD)
public class CurrentUserServiceImpl implements CurrentUserServiceService {
private final CrudDAO crudDAO;
private CurrentUser currentUser;
public CurrentUserServiceImpl(CrudDAO crudDAO) {
this.crudDAO = crudDAO;
}
public Long getUserId() {
return getUser().getId();
}
public CurrentUser getCurrentUser() {
if (this.isUserExist() && applicationUser == null) {
PersonProfile personProfile = (PersonProfile) SecurityUtils.getSubject().getPrincipal();
currentUser = crudDAO.find(personProfile.getUid());
}
return currentUser;
}
public boolean isUserExist() {
return SecurityUtils.getSubject().getPrincipal() != null;
}
}
PurchaseRequisition.class
public PurchaseRequisition {
@Inject
private CurrentUserService currentUserService;
@Inject
private CrudDAO crudDAO;
void setupRender() {
CurrentUser currentUser = currentUserService.getCurrentUser();
PurchaseReq pr = crudDAO.find(PurchaseReq.class, id);
if(currentUser.equals(pr.getAssignedUser()) {
System.out.println("equal");
}
}
}
答案 0 :(得分:2)
Hibernate使用CGLib或javassist创建代理类。因此getClass()
无法正常工作。请改用instanceof
。
此答案有另一种解决方案:https://stackoverflow.com/a/1139992/342852
答案 1 :(得分:1)
只有当对象类加载了不同的类加载器时才会出现:
class TestClassLoader extends URLClassLoader {
...
class Test1 {
public static void main(String[] args) throws Exception {
Object obj1 = new TestClassLoader().loadClass("test.Test1").newInstance();
Object obj2 = new TestClassLoader().loadClass("test.Test1").newInstance();
System.out.println(obj1.getClass() == obj2.getClass());
}
}
这将打印false
但是如果obj1 == obj2
那么obj1.getClass() == obj2.getClass()
总是。