wilson
wilson

Reputation: 657

Spring MVC - Setting values by default in Controllers

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
}

Upvotes: 2

Views: 1606

Answers (3)

Raman Sahasi
Raman Sahasi

Reputation: 31871

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

Upvotes: 1

TheCodingFrog
TheCodingFrog

Reputation: 3514

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.

Upvotes: 1

Raphael Amoedo
Raphael Amoedo

Reputation: 4465

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

Upvotes: 1

Related Questions