I have been receiving this error all the time when using Lazy evaluation in a ManyToMany relationship:
LazyInitializationException: failed to lazily initialize a collection of roles, could not initialize proxy - no Session
I know that using Eager fetch type will work fine, but this will be a headache and a performance lag to the application, so, I have to continue considering the Lazy fetch type.
I read that when using Spring Data JPA, @Transactional will initialize the lazy relations, but it doesn't seem to take effect with me.
Here is how my app look like:
Entities
Course Entity
@Entity
@Table(name = "course")
@Transactional
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "course_name")
private String courseName;
@Column(name = "course_description")
private String courseDescription;
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH,CascadeType.PERSIST})
@JoinTable(
        name = "course_student",
        joinColumns = @JoinColumn(name = "course_id"),
        inverseJoinColumns = @JoinColumn(name = "student_id") )
private List<Student> students;
Student Entity
@Entity
@Table(name = "students")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String grade;
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH,CascadeType.PERSIST},fetch = FetchType.EAGER)
@JoinTable(
        name = "course_student",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id") )
List<Course> courses;
Controller
@Controller
@RequestMapping("/courses")
@Transactional
public class CourseController {
....
@GetMapping("get-joined-students")
ModelAndView getJoined() {
    Course course = courseRepo.findById(6).get();
    for (Student student :
            course.getStudents()) {
        System.out.println("Student: " + student);
    }
    ModelAndView modelAndView = new ModelAndView("redirect:list");
    return modelAndView;
}
}
Repositories
Course Repository
@Repository
public interface CourseRepo extends JpaRepository<Course,Integer> {}
Student Repository
@Repository
public interface StudentRepo extends JpaRepository<Student,Integer> { }
Servlet Configuration File
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  ....    >
<context:annotation-config/>
<context:component-scan base-package="com.company.springdemo"/>
<mvc:annotation-driven/>
....
<jpa:repositories transaction-manager-ref="transactionManagerJPA" base-package="com.company.springdemo" entity-manager-factory-ref="EMF" />
<bean id="transactionManagerJPA" class="org.springframework.orm.jpa.JpaTransactionManager" >
    <property name="dataSource" ref="myDataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerJPA" />
<bean id="EMF"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="com.company.springdemo.entity" />
    <property name="dataSource" ref="myDataSource" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
    </property>
</bean>
What potentially could I be doing wrong?
 
     
    