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

Код: 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
29.09.2018, 23:06
    #39710402
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
В чем может быть дело? Это вообще загадка. Это не запрос, а задача планировщика заданий. Геттеры не дергаются.
...
Рейтинг: 0 / 0
30.09.2018, 01:12
    #39710429
cossack5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
Tsyklop, зачем вам mappedBy, если FK у вас в Client ?
Можно попробовать указать optional=true.
...
Рейтинг: 0 / 0
30.09.2018, 11:30
    #39710478
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
Зачем NativeQuery для такого простого запроса?
...
Рейтинг: 0 / 0
30.09.2018, 13:08
    #39710502
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
fixxerЗачем NativeQuery для такого простого запроса? пробовал разные варианты.
...
Рейтинг: 0 / 0
30.09.2018, 13:17
    #39710508
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
Tsyklop,

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

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

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

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

Можно посмотреть AbstractEntity?
...
Рейтинг: 0 / 0
30.09.2018, 14:07
    #39710523
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
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
30.09.2018, 14:16
    #39710525
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FetchType.LAZY не работает Hibernate
Ребят. Убрал mappedBy и все заработало.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / FetchType.LAZY не работает Hibernate / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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