powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / FetchType.LAZY не работает Hibernate
11 сообщений из 11, страница 1 из 1
FetchType.LAZY не работает Hibernate
    #39710366
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть Энтити:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
@Entity
@Table(name = "client")
public class Client extends AbstractEntity {

    @Column(name = "email", unique = true, updatable = false)
    private String email;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @JsonIgnore
    @Type(type = "text")
    @Column(name = "password")
    private String password;

    @JsonIgnore
    @Column(name = "admin")
    private boolean admin;

    @JoinColumn(name = "premiumId")
    @OneToOne(targetEntity = Premium.class, mappedBy = "client", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
    private Premium premium;

    @JoinColumn(name = "referralId")
    @OneToOne(targetEntity = Referral.class, mappedBy = "client", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
    private Referral referral;

    @JoinColumn(name = "discountId")
    @OneToOne(targetEntity = Discount.class, mappedBy = "client", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
    private Discount discount;

    @PrePersist
    protected void onCreate() {
        super.onCreate();
        this.admin = false;
    }

    public Client() {}

    // getters and setters

    @Override
    public String toString() {
        return "Client{" +
                "email='" + email + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", password='" + password + '\'' +
                ", admin=" + admin +
                '}';
    }

}



Есть такой запрос:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Repository
public class ClientDaoImpl extends AbstractDao implements ClientDao {

    private static final Logger LOGGER = LogManager.getLogger(ClientDaoImpl.class);

    public ClientDaoImpl(SessionFactory sessionFactory) {
        super(sessionFactory);
    }

    @Override
    public List<Client> findAll() {
        return sessionFactory.getCurrentSession().createNativeQuery("SELECT * FROM Client c;", Client.class).getResultList();
    }

}



Проблема в том что поля в энтити c с ленивой инициализацией. Но при выполнении запроса выше почему-то загружаются все сущности. Почему?

SessionFactory:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
@Bean
    public LocalSessionFactoryBean getSessionFactory() {

        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
        factoryBean.setDataSource(getDataSource());

        Properties props = new Properties();

        props.put("hibernate.dialect", env.getProperty("hibernate.dialect", "org.hibernate.dialect.MariaDBDialect"));
        props.put("hibernate.show_sql", env.getProperty("hibernate.show_sql", "true"));
        props.put("hibernate.format_sql", env.getProperty("hibernate.format_sql", "true"));
        props.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto", "update"));
        props.put("hibernate.connection.charSet", env.getProperty("hibernate.connection.charSet", "UTF-8"));
        props.put("hibernate.connection.CharSet", env.getProperty("hibernate.connection.CharSet", "UTF-8"));
        props.put("hibernate.connection.characterEncoding", env.getProperty("hibernate.connection.characterEncoding", "UTF-8"));
        props.put("hibernate.connection.useUnicode", env.getProperty("hibernate.connection.useUnicode", "true"));
        props.put("hibernate.enable_lazy_load_on_trans", env.getProperty("hibernate.enable_lazy_load_on_trans", "true"));
        props.put("hibernate.id.new_generator_mappings", env.getProperty("hibernate.id.new_generator_mappings", "false"));

        props.put("hibernate.hbm2ddl.import_files_sql_extractor", env.getProperty("hibernate.hbm2ddl.import_files_sql_extractor", ""));

        factoryBean.setHibernateProperties(props);
        factoryBean.setPackagesToScan("app.site.entity");

        return factoryBean;

    }



Запрос выполняется тут:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
@Component
@Transactional
public class PremiumScheduler {

    private ClientDao clientDao;

    private PremiumDao premiumDao;

    private static final Logger LOGGER = LogManager.getLogger(PremiumScheduler.class);

    public PremiumScheduler(ClientDao clientDao, PremiumDao premiumDao) {
        this.clientDao = clientDao;
        this.premiumDao = premiumDao;
    }

    @Scheduled(cron = "0 */1 * * * *")
    public void check() {

        LOGGER.info("SCHEDULED");

        Calendar calendar = Calendar.getInstance();

        calendar.add(Calendar.DATE, -1);

        clientDao.findAll().forEach(client -> { // тут

            LOGGER.info(client);



        });

    }

}



Если что-то еще нужно пишите. Я не знаю в чем дело.
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710402
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В чем может быть дело? Это вообще загадка. Это не запрос, а задача планировщика заданий. Геттеры не дергаются.
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710429
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop, зачем вам mappedBy, если FK у вас в Client ?
Можно попробовать указать optional=true.
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710478
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем NativeQuery для такого простого запроса?
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710502
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fixxerЗачем NativeQuery для такого простого запроса? пробовал разные варианты.
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710508
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

Т.е. запрос один и выглядит как left join?
Или всё таки загрузка происходит при выполнении toString()?
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710517
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel_nvTsyklop,

Т.е. запрос один и выглядит как left join?
Или всё таки загрузка происходит при выполнении toString()?

Нет. Сначала идет просто выборка всех Client-ов . Простой SELECT * FROM client; .
И потом вижу что он проходится по каждой выбранной сущности и загружает их данные. Там уже join-ы есть.
Это вся загрузка идет до forEach . В forEach попадают уже загруженные сущности.
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710518
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cossack5Tsyklop, зачем вам mappedBy, если FK у вас в Client ?
Можно попробовать указать optional=true.

optional и так true по умолчанию. Попробовал поставить false - ничего не поменялось.
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710521
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

Можно посмотреть AbstractEntity?
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710523
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavel_nv,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
@MappedSuperclass
public class AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created", updatable = false)
    private Date created;

    @PrePersist
    protected void onCreate() {
        created = new Date();
    }

    public long getId() {
        return id;
    }

    public Date getCreated() {
        return created;
    }

    @Override
    public String toString() {
        return "AbstractEntity{" +
                "id=" + id +
                ", created=" + created +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AbstractEntity that = (AbstractEntity) o;
        return id == that.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
    
}
...
Рейтинг: 0 / 0
FetchType.LAZY не работает Hibernate
    #39710525
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят. Убрал mappedBy и все заработало.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / FetchType.LAZY не работает Hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]