Ленивая загрузка не работает в JPA с Hibernate - PullRequest
0 голосов
/ 25 ноября 2018

Я использую JPA с Hibernate в моем приложении весенней загрузки.Всякий раз, когда я пытаюсь получить сущности, используя методы jpa, он возвращает сущность плюс все ассоциации, присутствующие внутри нее.Я хотел получить связанные сущности по требованию (отложенная загрузка), поэтому я предоставил fetch = FetchType.LAZY в своем доменном классе.Но все равно он возвращает все записи.

Ниже приведен код: Case.java

    @Entity
    @Table(name="smss_case")
    public class Case implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -2608745044895898119L;

    @Id
    @Column(name = "case_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer caseId;

    @Column( name="case_title" )
    private String caseTitle;

    @JsonManagedReference
    @OneToMany(mappedBy="smmsCase", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    private Set<Task> tasks;

    }

}

Task.java

@Entity
@Table(name="task_prop")
public class Task implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -483515808714392369L;

    @Id
    @Column(name = "task_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer taskId;

    @Column(name="task_title")
    private String taskTitle;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn( name="case_id", nullable=false)
    private Case smmsCase;
// getters and setters
}

Service.java

public Case getCases(Integer id) {
        return dao.findById(1).get();
}

Dao.java

public interface ServiceDao extends JpaRepository<Case, Integer>{

}

{
"caseId": 1, "caseTitle": "эргономика", "tasks": [
{
"taskId": 1, "taskTitle": "ca"}, {
"taskId": 2, "taskTitle":"hazards"}, {
"taskId": 3, "taskTitle": "лекарство"}]}

Любая помощь будет высоко оценена!

Спасибо!

1 Ответ

0 голосов
/ 12 июня 2019

Было сложно исследовать, но у меня возникла эта проблема, так как я использовал mapstruct , и это делает глубокое / вложенное отображение , и в процессе он вызывает геттер загруженного ленивогоимущество.Проблема была решена, когда я использовал mapstrct @BeforeMapping.

@Mapper
public interface HibernateAwareMapper {
    @BeforeMapping
    default <T> Set<T> fixLazyLoadingSet(Collection<?> c, @TargetType Class<?> targetType) {
        if (!Util.wasInitialized(c)) {
            return Collections.emptySet();
        }
        return null;
    }

    @BeforeMapping
    default <T> List<T> fixLazyLoadingList(Collection<?> c, @TargetType Class<?> targetType) {
        if (!Util.wasInitialized(c)) {
            return Collections.emptyList();
        }
        return null;
    }

   class Util {
       static boolean wasInitialized(Object c) {
           if (!(c instanceof PersistentCollection)) {
               return true;
           }

           PersistentCollection pc = (PersistentCollection) c;
           return pc.wasInitialized();
       }
   }
}

Ref.Кокорин

...