I am learning Spring boot JPA hibernate mapping. I am trying to create 2 tables Employee and Address. It is a unidirectional OneToOne mapping. I am creating foreign key in Employee table. Employee contains address and it is a strong association. Without Employee, Address doesn't exist.
My createEmployee controller is working fine but when I'm trying to updateEmployee, it is creating a new entry in the Address table.
Please tell me if anything I am missing or doing wrong. Thanks!
Below is the code.
Address.java
@Entity @Table
@NoArgsConstructor @Getter @Setter
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "addr_id")
private Integer addressId;
private String addr;
public Address(String addr) {
this.addr = addr;
}
Employee.java
@Table @Entity
@NoArgsConstructor @Getter @Setter
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer empId;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id", referencedColumnName = "addr_id")
private Address address;
public Employee(String name, Address address) {
this.name = name;
this.address = address;
}
AddressRepo.java
public interface AddressRepo extends JpaRepository<Address, Integer> {
}
public interface EmployeeRepo extends JpaRepository<Employee, Integer> {
}
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeRepo employeeRepo;
@Override
public Employee createEmployee(Employee employee) {
Employee tempEmployee = this.employeeRepo.save(employee);
return tempEmployee;
}
@Override
public Employee updateEmployee(Employee employee, Integer id) {
Employee tempEmployee = this.employeeRepo.findById(id).get();
tempEmployee.setName(employee.getName());
tempEmployee.setAddress(employee.getAddress());
System.out.println(employee);
return employeeRepo.save(tempEmployee);
}
@Override
public Employee getEmployee(Integer id) {
return this.employeeRepo.findById(id).get();
}
@Override
public Employee deleteEmployee(Integer id) {
Employee employee = getEmployee(id);
this.employeeRepo.deleteById(id);
return employee;
}
@Override
public List<Employee> getAllEmployeees() {
return this.employeeRepo.findAll();
}
}
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
// Get all employees
@GetMapping("/")
public List<Employee> getAllEmployees() {
return this.employeeService.getAllEmployeees();
}
// Get one employee
@GetMapping("/{employeeId}")
public Employee getEmployee(@PathVariable("employeeId") Integer employeeId) {
return this.getEmployee(employeeId);
}
// save employee
@PostMapping("/")
public Employee createEmployee(@RequestBody Employee employee) {
return this.employeeService.createEmployee(employee);
}
// update employee
@PutMapping("/{employeeId}")
public Employee updateEmployee(@PathVariable("employeeId") Integer employeeId,
@RequestBody Employee employee) {
return this.employeeService.updateEmployee(employee, employeeId);
}
// delete employee
@DeleteMapping("/{employeeId}")
public Employee deleteEmployee(@PathVariable("employeeId") Integer employeeId) {
return this.employeeService.deleteEmployee(employeeId);
}
}
