Почему не работает lazy initialization в hibernate

269
03 мая 2017, 08:56

Не работает ленивая инициализация в 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";
    }
}
READ ALSO
Рабочий пример кода с onRestoreInstanceState

Рабочий пример кода с onRestoreInstanceState

Напишите кому несложно какой-нибудь рабочий пример кода с сохранением состояния активити и восстановлением состояние при следующем её старте

257
Как подключить документацию javadoc к проекту

Как подключить документацию javadoc к проекту

Расскажите как получить документацию к Yandex MapKit? Из информации в issue говорят "Документация и бибилотека доступна через gradle"

436
помогите составить код в java ide [требует правки]

помогите составить код в java ide [требует правки]

Дано целое число N (> 0)Найти значение выражения 1

235
Как в класс ObjectOutputStream добавить логирование?

Как в класс ObjectOutputStream добавить логирование?

Как в класс ObjectOutputStream добавить логированиеОн стандартный и открыватеся только на чтение

229