'Spring JPA not returning Foreign keys in response
I have a database with some entities, ( in parent child relationship )I can say and when When I try to make a query to child table to get all the rows, I only get the fields which are not foreign keys. How can I include the foreign key in the response json. Can anyone help me figure this out ?
Parent Class which is working fine when I try to repository.findAll()
and it works as expected.
@Entity
@Table(name = "Employees")
@Data
@NoArgsConstructor
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private long id;
private String name;
private String description;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "employee")
private List<Projects> projects;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "employee")
private Address address;
}
Child class:
@Entity
@Table(name = "Address")
@Data
@NoArgsConstructor
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String city;
private String state;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "emp_id", nullable = false)
@JsonBackReference
private Employee employee;
}
Here is the repository class for Address Entity
@Repository
public interface AddressRepository extends JpaRepository<Address, Long> {
}
When I try AddressRepository.findAll()
What I get:
[{
"id": 1,
"city": "new york",
"state": "new york"
}]
what I want to get:
"id": 1,
"city": "new york",
"state": "new york",
"emp_id": 1 //which is the foreign key referring to Employee table
}]
What I tried is I updated my Employee column in Address Entity as follow but no luck
@Entity
@Table(name = "Address")
@Data
@NoArgsConstructor
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String city;
private String state;
@OneToOne(fetch = FetchType.EAGER)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "client_id", scope = Client.class)
@JsonIdentityReference(alwaysAsId = true)
@JoinColumn(name = "client_id", nullable = false)
@JsonBackReference
@JsonProperty("clientId")
private Employee employee;
}
Solution 1:[1]
You could use a JPA projection:
public class AddressDto {
private long id;
private String city;
private String state;
private long employeeId;
public AddressDto(long id, String city, String state, Employee employee) {
this.id = id;
this.city = city;
this.state = state;
this.employeeId = employee.getId();
}
// getters etc..
}
@Repository
public interface AddressRepository extends JpaRepository<Address, Long> {
List<AddressDto> findAllProjectedBy();
}
Solution 2:[2]
Use @JsonProperty on each Foreign Key.
@Entity
@Table(name = "Employees")
@Data
@NoArgsConstructor
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private long id;
private String name;
private String description;
@JsonProperty
@OneToMany(fetch = FetchType.EAGER, mappedBy = "employee")
private List<Projects> projects;
@JsonProperty
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "employee")
private Address address;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | samuelrusu |