0

I am working with JPA to get deep insight and I am referring Pro JPA2 Mastering the Java Persistance API.

In Chapter 6 I am working with example Working with detached Entities, I created the example as per given guideline. This topic says @ManyToOne/@OneToMany bidirection mapping is lazy loaded.However When I created same example this is not true that relationship is lazy loaded. Relationship are eagerly loded. Here is my example

My JSF Templete:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Student Registration</title>
</h:head>
<h:body>
    <h2>Enter student Details</h2>
    <h:form>
        <h:commandButton actionListener="#{employeeService.saveEmployee}"
            value="Save" />
        <h:inputText value="#{employeeService.empId}" id="empId" />
        <h:commandButton actionListener="#{employeeService.updateEmployee}"
            value="update" />
    </h:form>
    <form method="post" action="employee">
        <input type="submit" value="go" />
    </form>
</h:body>
</html>

EmployeeServlet

package com.jsfapp.servlet;

import java.io.IOException;
import java.util.List;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jsfapp.dao.EmployeeDAO;
import com.jsfapp.jpa.entities.Department;

@WebServlet(urlPatterns = "/employee")
public class EmployeeServlet extends HttpServlet {

    @EJB
    private EmployeeDAO employeeService;

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        /*
         * List<Employee> employees = employeeService.findAll();
         * req.setAttribute("employees", employees);
         * System.out.println("===>"+employees.get(0).getName());;
         */
        List<Department> dept = employeeService.getDepartment();
        req.setAttribute("departments", dept);
        this.getServletContext().getRequestDispatcher("/emp.jsp")
                .forward(req, resp);

    }

}

EmployeeDAO

package com.jsfapp.dao;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import com.jsfapp.jpa.entities.Department;
import com.jsfapp.jpa.entities.Employee;

@Stateless(name = "employeeDAO")
@LocalBean
public class EmployeeDAO {

    @PersistenceContext(unitName = "JSFApplication")
    private EntityManager em;

    public void saveEmployee(Employee emp) {
        em.persist(emp);
    }

    public void updateEmployee(Employee emp) {
        Employee employeeMerged = em.merge(emp);
        employeeMerged.setName("AfterMerge");
    }

    public Employee findById(Integer empId) {
        return em.find(Employee.class, empId);
    }

    public List<Employee> findAll() {
        TypedQuery<Employee> employeeQuery = em.createQuery(
                "SELECT e FROM Employee e", Employee.class);
        return employeeQuery.getResultList();
    }

    public List<Department> getDepartment() {
        TypedQuery<Department> dept = em.createQuery(
                "SELECT d FROM Department d",Department.class);
        //dept.setParameter("deptId", 3);
        List<Department> depts = dept.getResultList();
        return depts;
    }
}

Department Entity

package com.jsfapp.jpa.entities;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    @OneToMany(mappedBy = "department")
    private List<Employee> employees;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(List<Employee> employees) {
        this.employees = employees;
    }
}

Employee Entity

  package com.jsfapp.jpa.entities;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "Employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "DEPT_ID")
    private Department department;
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "EMP_ADDR_ID")
    private Address address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

}

now when I get Department Entity It load lazy loaded Employee . I know that it is provider dependent but why it is loaded eagerly. please help

P.S. I am using glassfish3 ,Eclipse Link 2.3 for JPA

optional
  • 3,260
  • 5
  • 26
  • 47
  • toMany associations are loaded lazily by default. toOne associations are loaded eagerly by default. How do you dtermine that the employees of the departments are loaded eagerly? – JB Nizet Jun 05 '16 at 06:13
  • When I get department and associated employee and display it to jsp all employee are there but according to JPA spec it should be lazy – optional Jun 05 '16 at 06:16
  • See answer here http://stackoverflow.com/a/37567643/1356423 . – Alan Hay Jun 05 '16 at 07:52
  • I am also reffering same book as you mention in the link .but I found the solution. thank you – optional Jun 05 '16 at 07:54

0 Answers0