JPA Hibernate OneToOne Mapping

29 Views Asked by At

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

My HTTP request: Postman

0

There are 0 best solutions below