我在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()方法即使对于真实情况也返回falseCourse#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()是执行此操作的方法。

10-06 02:40