178 votes

Comment récupérer les associations FetchType.LAZY avec JPA et Hibernate dans un Spring Controller ?

J'ai une classe Personne :

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Role> roles;
    // etc
}

Avec une relation many-to-many qui est paresseuse.

Dans mon contrôleur, j'ai

@Controller
@RequestMapping("/person")
public class PersonController {
    @Autowired
    PersonRepository personRepository;

    @RequestMapping("/get")
    public @ResponseBody Person getPerson() {
        Person person = personRepository.findOne(1L);
        return person;
    }
}

Et le PersonRepository est juste ce code, écrit en fonction de ce guide

public interface PersonRepository extends JpaRepository<Person, Long> {
}

Cependant, dans ce contrôleur J'ai en fait besoin du lazy-data. Comment puis-je déclencher son chargement ?

Essayer d'y accéder échouera avec

a échoué dans l'initialisation paresseuse d'une collection de rôles : no.dusken.momus.model.Person.roles, n'a pas pu initialiser le proxy - no Session

ou d'autres exceptions en fonction de ce que j'essaie.

Mon xml-description en cas de besoin.

Gracias.

6voto

Michail Nikolaev Points 1870

Je pense que vous avez besoin OpenSessionInViewFilter pour garder votre session ouverte pendant le rendu de la vue (mais ce n'est pas une très bonne pratique).

2voto

neel4soft Points 92

Vous pouvez faire la même chose comme ça :

@Override
public FaqQuestions getFaqQuestionById(Long questionId) {
    session = sessionFactory.openSession();
    tx = session.beginTransaction();
    FaqQuestions faqQuestions = null;
    try {
        faqQuestions = (FaqQuestions) session.get(FaqQuestions.class,
                questionId);
        Hibernate.initialize(faqQuestions.getFaqAnswers());

        tx.commit();
        faqQuestions.getFaqAnswers().size();
    } finally {
        session.close();
    }
    return faqQuestions;
}

Utilisez simplement faqQuestions.getFaqAnswers().size()dans votre contrôleur et vous obtiendrez la taille de la liste initialisée paresseusement, sans avoir à récupérer la liste elle-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X