ManyToMany(OneToMany too) doesn't work when method directly return this list without any actions with it

Viewed 21

I trying to get list of channels, but hibernate doesn't do the request to DB when I return this list directly from method.

@Transactional
public List<Channel> getChannelsOfCustomer(Customer customer){
    Session session = sessionFactory.getCurrentSession();
    Customer customer1 = session.get(Customer.class, customer.getCustomerId());
    return customer1.getChannels();
}

Logs:

Hibernate: select customer0_.customer_id as customer1_1_0_, customer0_.name as name2_1_0_ from customer customer0_ where customer0_.customer_id=?

If I call system.out.println, then I get channels and can return this list

@Transactional
public List<Channel> getChannelsOfCustomer(Customer customer){
    Session session = sessionFactory.getCurrentSession();
    Customer customer1 = session.get(Customer.class, customer.getCustomerId());
    List<Channel> channels = customer1.getChannels();
    System.out.println(channels);
    return channels;
}

Logs:

Hibernate: select customer0_.customer_id as customer1_1_0_, customer0_.name as name2_1_0_ from customer customer0_ where customer0_.customer_id=?
Hibernate: select channels0_.customer_id as customer4_2_0_, channels0_.channel_id as channel_3_2_0_, channel1_.channel_id as channel_1_0_1_, channel1_.name as name2_0_1_ from customer_channel channels0_ inner join channel channel1_ on channels0_.channel_id=channel1_.channel_id where channels0_.customer_id=?

Why Hibernate doesn't trigger on getChannels() method? Do I need to add something to configuration?

Configuration:

Customer:

@ManyToMany
@JoinTable(
        name="customer_channel",
        joinColumns = @JoinColumn(name="customer_id"),
        inverseJoinColumns = @JoinColumn(name="channel_id")
)
private List<Channel> channels;

Channel:

@ManyToMany(mappedBy = "channels")
private List<Customer> customers;

Hibernate config:

@Configuration
@PropertySource("classpath:hibernate.properties")
@EnableTransactionManagement
public class HibernateConfig {

    private final Environment environment;

    @Autowired
    public HibernateConfig(Environment environment) {
        this.environment = environment;
    }

    @Bean
    public DataSource postgresDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(Objects.requireNonNull(environment.getProperty("hibernate.driver_class")));
        dataSource.setUrl(environment.getProperty("hibernate.connection.url"));
        dataSource.setUsername(environment.getProperty("hibernate.connection.username"));
        dataSource.setPassword(environment.getProperty("hibernate.connection.password"));

        return dataSource;
    }

    private Properties hibernateProperties(){
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getProperty("hibernate.show_sql"));
        return properties;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory(){
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(postgresDataSource());
        sessionFactory.setPackagesToScan("test.spring.mvc.model");
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public PlatformTransactionManager hibernateTransactionManager(){
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());

        return transactionManager;
    }

}
0 Answers
Related