2

Based on the following mapping (at the bottom of question) I need to know how to set an specific value in the "department_id" in the Employee class.

Employee             
--------------------------------------------
id  | firstname  | lastname | department_id
--------------------------------------------
1   | David      | Smith    |     1 


Department              
-----------
id  | name
-----------
1   | Dep A
2   | Dep B
3   | Dep C

saveEmployee method (EmployeeController class):

@RequestMapping(value = "/saveEmployee", method = RequestMethod.POST)
public String saveEmployee(@ModelAttribute("employee") Employee employee){
    /*  I need to set the department "id" (foreign key) into the Employee
table directly in this method. */
    int id = 1; // 2 or 3...
    /* The "department_id" in the Employee class should 
       to receive the "id" value. */
    employee.setDepartment(id); // It does not work.
    employeeService.saveEmployee(employee);
    return "redirect:/employees";
}

Employee class:

@Entity
public class Employee{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String firstname;
    private String lastname;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    // Getters and Setters
}

Department class:

@Entity
public class Department{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    // Getters and Setters
}

3 Answers 3

1

Look carefully at your Employee class:

@Entity
public class Employee{
    ...

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    /* THIS IS NOT AN INTEGER DATA TYPE, IT'S A DEPARTMENT DATA TYPE. 
    SO THE SETTER FOR THIS WILL LOOK SOMEWHAT LIKE THIS:*/

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

    ...
    // Getters and Setters
}

In order to set a department create an instance your Department and then send it through setter:

@RequestMapping(value = "/saveEmployee", method = RequestMethod.POST)
public String saveEmployee(@ModelAttribute("employee") Employee employee){
    int id = 1; // 2 or 3...

    Department temporaryDepartment = new Department();
    temporaryDepartment.setId(id);

    employee.setDepartment(temporaryDepartment); 
    employeeService.saveEmployee(employee);
    return "redirect:/employees";
}
Sign up to request clarification or add additional context in comments.

Comments

1

Actually your setDepartment receives a Department instance. So you have to do this:

int id = 1; 
Department department = new Department(); //Or you can use Autowired
department.setId(id); // Set Id Department
employee.setDepartment(department); // A Department instance
employeeService.saveEmployee(employee);
return "redirect:/employees";

Comments

1

Actually, You have set Generation strategy as shown below

@Id
    @GeneratedValue(strategy=GenerationType.AUTO) 

on Department class which means you would want hibernate to generate the ids for you so that you don't have to worry about setting the department id. You just need to set the department name.

Below is the working code, JPAEmployeeTest.java:

package com.chatar.hibernate.receipes.example;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.chatar.hibernate.receipes.example.domain.annotations.Department;
import com.chatar.hibernate.receipes.example.domain.annotations.Employee;

public class JPAEmployeeTest {

    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( "employee" );

        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();

        Employee employee = new Employee();
        Department department = new Department();
        department.setName("Engineering");

        employee.setFirstName("Johny");
        employee.setLastName("Walker");
        employee.setDepartment(department);

        entityManager.persist(employee);

        entityManager.getTransaction().commit();

        entityManager.close();

    }
}

And my domain object, Employee.java

package com.chatar.hibernate.receipes.example.domain.annotations;

import java.io.Serializable;

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

@Entity
public class Employee implements Serializable {

    private static final long serialVersionUID = -5641563180459243167L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "department_id" )
    private Department department;

    public long getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Department getDepartment() {
        return department;
    }

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

And Department.java

package com.chatar.hibernate.receipes.example.domain.annotations;

import java.io.Serializable;

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

@Entity
public class Department implements Serializable {

    private static final long serialVersionUID = -598469568850009702L;
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;
    private String name;

    public long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

My persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation=
   "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
   version="1.0">

   <persistence-unit name="employee" transaction-type="RESOURCE_LOCAL">
                             <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <class>com.chatar.hibernate.receipes.example.domain.annotations.Employee</class>
      <class>com.chatar.hibernate.receipes.example.domain.annotations.Department</class>

      <properties>
       <property name="javax.persistence.jdbc.driver"
            value = "org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="javax.persistence.jdbc.url" value = "jdbc:derby://localhost:1527/BookShopDB" />
        <property name="javax.persistence.jdbc.user" value="book" />
        <property name="javax.persistence.jdbc.password" value = "book" />
        <property name="hibernate.dialect" value = "org.hibernate.dialect.DerbyDialect" />
     </properties>

   </persistence-unit>
</persistence>

My Database output:

ij> select * from employee;
ID         |FIRST_NAME                                                                                          |LAST_NAME                                                                                           |DEPARTMENT&
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
163840     |Johny                                                                                               |Walker                                                                                              |1          

1 row selected
ij> select * from department;
ID         |NAME                                                                                                
----------------------------------------------------------------------------------------------------------------
1          |Engineering                                                                                         

1 row selected
ij> 

Note - I'm using GenerationType.TABLE as somehow AUTO was not working for my database i.e. Debry. Also, I have set CascadeType.ALL so that when I save Employee entity, Hibernate saves all references entities e.g. Department in my case.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.