2016-11-03 3 views
0

Я использую Java 8 и Spring Data JPA с Hibernate. Я наблюдаю странное поведение.JPA - Ленатически загруженная ссылка на объект имеет свои поля null

Все отношения сущностей 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(), я получаю значение правильно.

Мой вопрос заключается в том, что я делаю что-то принципиально неправильно, обращаясь к полям лениво загруженной сущности вместо того, чтобы проходить через свои методы получения.

+0

Это то, что вы получаете при использовании Hibernate, используя прокси, вместо улучшения байткода, и, следовательно, это невежественно относительно ленивых полей загрузки, поскольку он не может определить их использование. Включите усовершенствование байт-кода или используйте поставщика JPA, который делает это из коробки –

ответ

3

Hibernate ORM Возвращает объекты прокси и ленивые нагрузки для поддержки кеширования и повышения производительности. В настоящее время невозможно перехватить вызовы на поля прокси, поэтому other.shortName всегда будет null. Только способ перехвата вызовов для прокси-методов. Так же, как и в вашем случае, other.getShortName() - это способ сделать это.

Смежные вопросы