[Java] Cómo cargar elementos perezosos de Hibernate / JPA en mi controlador



Answers

Aunque esta es una publicación anterior, considere usar @NamedEntityGraph (Javax Persistence) y @EntityGraph (Spring Data JPA). La combinación funciona.

Ejemplo

@Entity
@Table(name = "Employee", schema = "dbo", catalog = "ARCHO")
@NamedEntityGraph(name = "employeeAuthorities",
            attributeNodes = @NamedAttributeNode("employeeGroups"))
public class EmployeeEntity implements Serializable, UserDetails {
// your props
}

y luego el repositorio de primavera como abajo

@RepositoryRestResource(collectionResourceRel = "Employee", path = "Employee")
public interface IEmployeeRepository extends PagingAndSortingRepository<EmployeeEntity, String>           {

    @EntityGraph(value = "employeeAuthorities", type = EntityGraphType.LOAD)
    EmployeeEntity getByUsername(String userName);

}
Question

Tengo una clase de persona:

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

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

Con una relación de muchos a muchos que es flojo.

En mi controlador tengo

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

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

Y el PersonRepository es solo este código, escrito de acuerdo con esta guía

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

Sin embargo, en este controlador realmente necesito los datos vagos. ¿Cómo puedo activar su carga?

Tratar de acceder fallará con

Error al inicializar lentamente una colección de roles: no.dusken.momus.model.Person.roles, no se pudo inicializar el proxy - sin Session

u otras excepciones según lo que intento.

Mi xml-description , en caso de ser necesario.

Gracias.




Puedes hacer lo mismo así:

@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;
}

Simplemente use faqQuestions.getFaqAnswers (). Size () para su controlador y obtendrá el tamaño si la lista se actualiza de forma lenta, sin recuperar la lista.




solo se puede cargar de forma perezosa dentro de una transacción. Para que pueda acceder a la colección en su repositorio, que tiene una transacción, o lo que normalmente hago es get with association una get with association , o configurar fetchmode a impaciente.






Links