I have two entities. Address and Employee. When I try to persist using CommandLineRunner everything is working as expected but when I try the same from REST endpoint, the data is saved in DB but I am getting the following error
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)address"]
CommandLineRunner (This works fine)
@SpringBootApplication
@RequiredArgsConstructor
public class OneToOneApplication  implements CommandLineRunner {
    private final EmployeeRepository employeeRepository;
    public static void main(String[] args) {
        SpringApplication.run(OneToOneApplication.class, args);
    }
    @Override
    @Transactional
    public void run(String... args) throws Exception {
        Employee employee = new Employee();
        employee.setAge(10);
        employee.setName("SomeName");
        Address address = new Address();
        address.setEmployee(employee);
        address.setStreet("SomeStreet");
        employee.setAddress(address);
        employeeRepository.save(employee);
    }
}
This is not working. POST http://localhost:9191/save
{
    "name": "somename",
    "age": 15,
    "address": {
        "street": "somestreet"
    }
}
Address.java
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Address")
public class Address {
    @Id
    @Column(name = "employee_id")
    private Long id;
    private String street;
    @MapsId
    @OneToOne
    @JoinColumn (name = "employee_id")
    private Employee employee;
}
Employee.java
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Employee")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    private String name;
    private int age;
    @OneToOne(mappedBy = "employee", cascade = CascadeType.ALL)
    private Address address;
}
EmployeeRepository.java
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
EmployeeService.java
@Service
public class EmployeeService {
    @Autowired
    EmployeeRepository employeeRepository;
    public Employee saveEmployee(Employee employee) {
        Address address = employee.getAddress();
        address.setEmployee(employee);
        return employeeRepository.save(employee);
    }
}
I guess I am doing some mistake in EmployeeService.java.
- How to make it work?
- Do I really need AddressRepository?
