Не работает ленивая инициализация в hibernate. Вот классы
@Entity
@Table(name = "PERSONS")
public class Persons {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "person", cascade = CascadeType.REMOVE)
public List<Cards> cards = new ArrayList<Cards>();
public Persons() {
}
//getters and setters
}
Класс Cards
@Entity
@Table(name = "CARDS")
public class Cards {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "card", cascade = CascadeType.REMOVE)
@JsonManagedReference
public List<BalanceHist> balanceHists = new ArrayList<BalanceHist>();
@OneToMany(fetch = FetchType.LAZY, mappedBy = "card", cascade = CascadeType.REMOVE)
@JsonManagedReference
public List<Events> events = new ArrayList<Events>();
//getters and setters
}
Если посмотреть что приходит в json'е на фронт то видно следующее:
Как видно из картинки метод отрабатывает, хотя я должен получить ошибку, так как если посмотреть на метод получения пользователей в DAO:
@Repository
@Transactional
public class PersonRepository extends AbstractRepository<Persons> {
public PersonRepository() {
super(Persons.class);
}
@Override
public List<Persons> getAll() {
return super.getAll();
}
}
Класс родитель для DAO:
@Repository
@Transactional
public abstract class AbstractRepository<Entity> {
private Class persistentClass;
public AbstractRepository(Class persistentClass) {
this.persistentClass = persistentClass;
}
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
public List<Entity> getAll() {
return getSession().createCriteria(persistentClass).list();
}
}
То есть я нигде не инициализирую поля сущностей помеченных аннотацией @OneToMany(fetch = FetchType.LAZY, mappedBy = "card", cascade = CascadeType.REMOVE), и по идеи должен получать ошибку при обращении к ним, но у меня почему сразу тянутся все зависимости из БД. Подскажите в чем может быть проблема.
@Repository
@Transactional
public class PersonRepository extends AbstractRepository<Persons> {
public PersonRepository() {
super(Persons.class);
}
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
@Override
public List<Persons> getAll() {
// Criteria criteria = createEntityCriteria();
// criteria.addOrder(Order.asc("personId"));
// return criteria.list();
List<Persons> personsList = getSession().createCriteria(Persons.class).list();
for (Persons persons : personsList) {
Hibernate.initialize(persons.getCards());
}
return personsList;
}
}
@Service
@Transactional
public class PersonService {
public List<Persons> getUsers() {
List<Persons> personList = new ArrayList<>();
for (Persons person : personRepository.getAll()) {
if (person.getRole().getRoleType().equals("USER"))
personList.add(person);
}
return personList;
}
}
@Controller
@RequestMapping("/")
public class AppController {
@RequestMapping(value = {"/", "/home"}, method = RequestMethod.GET)
public String homePage(ModelMap model) {
model.addAttribute("greeting", "Welcome to the first page of the project");
System.out.println("ASASAS");
for (Persons person: personService.getUsers()) {
for (Cards card:person.getCards()) {
System.out.println("TROLOLO");
System.out.println(card.getCardName());
if (Const.DEBUG) {
if (logger.isDebugEnabled()) {
logger.debug(card.getCardName());
}
}
}
}
return "welcome";
}
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости