java Cómo cargar elementos perezosos de Hibernate / JPA en mi controlador
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);
}
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.
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.
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.