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;
}
}