I have 2 entities/model. Department
and Employee
Relationship is 1 Department
has MANY Employee
.
My understanding of how to go about implementing a Bi-directional relationship of entities is:
- Identify the Parent and Child
- Identify the owner of relationship (in this case,
Department
ownsEmployee
). Then addmappedBy='fieldname'
- Annotate the both entities with inverse.
@OneToMany
on 1st entity and@ManyToOne
on the 2nd entity
Below is how I designed the app.
Model
Department
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String departmentName;
@OneToMany(mappedBy = "department")
private Set<Employee> employees;
//getters and setters...
}
Employee
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String middleName;
private String lastName;
@ManyToOne
@JsonIgnore
private Department department;
}
Now, if I GET department by id (e.g. localhost:8080/department/1
)
I'll get :
{
"id": 1,
"departmentName": "Accounting",
"employees": [
{
"id": 1,
"firstName": "John",
"middleName": "Johnny",
"lastName": "Doe"
}
]
}
which is fine because I can see the Employee
(s) who belongs to a specific Department
.
However, on the employee side, if I GET employee by id (e.g. localhost:8080/employee/1
)
I would get a json result which only displays the employee name BUT does NOT include the Department
where the Employee
belongs.
{
"id": 1,
"firstName": "John",
"middleName": "Johnny",
"lastName": "Doe"
}
I had to add @JsonIgnore
to department
field in Employee
class to avoid stackoverflow/endless nested json serialization when doing a GET department (e.g. localhost:8080/department/1
)
I have 2 questions :
- How do I also display the department information when doing a GET employee by id?
- Do I need to create a custom query in the Repository interface using
@Query
instead? At least for the purpose of displaying theDepartment
name along withEmployee
when I do a GETEmployee
by id?
Thank you.