JPA - Lazily加载的实体引用的字段为null

时间:2016-11-03 05:18:16

标签: java hibernate jpa spring-data

我正在使用Java 8和Spring Data JPA和Hibernate。我观察到一种奇怪的行为。

所有实体关系都是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方法来做任何根本错误的事情。

1 个答案:

答案 0 :(得分:3)

Hibernate ORM返回代理对象和延迟加载以支持缓存并提高性能。目前无法拦截对代理字段的调用,因此other.shortName始终为null,唯一的方法是拦截对代理方法的调用。就像你的情况一样,other.getShortName()就是这样做的。