我在Hibernate中使用Java 8和Spring Data JPA。我观察到一种奇怪的行为。
所有实体关系都是LAZY加载的。
Course toBeMatched = //...a repository call to get a course...;
for (Student s : college.getStudents()) {
if (s.getCourse().equals(toBeMatched)) {
found = true;
}
}
我的
equals()
方法即使对于真实情况也返回false
。 Course#equals
的实现大致遵循以下原则:@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
Course other = (Course) obj;
if (shortName == null) {
if (other.shortName != null)
return false;
} else if (!shortName.equals(other.shortName))
return false;
return true;
}
问题:
我的问题是
shortName.equals(other.shortName)
错误地失败了,因为other.shortName
始终是null
,但是,如果我使用other.getShortName()
,则可以正确获取值。我的问题是,我是否通过访问延迟加载的实体的字段而不是通过其getter方法来做任何根本上错误的事情。
最佳答案
Hibernate ORM返回代理对象和延迟加载以支持缓存并提高性能。当前没有任何方法可以拦截对Proxy字段的调用,因此other.shortName
始终为null
。唯一的方法是拦截对Proxy方法的调用。就像您的情况一样,other.getShortName()
是执行此操作的方法。