Reputation: 730
I am trying to create bidirectional OnetoMany, ManytoOne mapping. Below are the entity classes StudentAddress and Student3 class:
Student3 entity class:
@Entity
@Table(name="Student3", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")
public class Student3 {
@Id
@Column(name = "STUDENT_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int student_id;
@Column(name = "STUDENT_NAME")
private String student_name;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="student_address_id",referencedColumnName="address_id")
/*@JoinColumn(name = "student_address_id")*/
private StudentAddress studentAddress;
@Override
public String toString() {
return "Student3 [student_id=" + student_id + ", STUDENT_NAME=" + student_name + "]";
}
public int getStudent_id() {
return student_id;
}
public void setStudent_id(int student_id) {
this.student_id = student_id;
}
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}
public StudentAddress getStudentAddress() {
return studentAddress;
}
public void setStudentAddress(StudentAddress studentAddress) {
this.studentAddress = studentAddress;
}
public Student3() {
}
}
Student address entity class:
@Entity
@Table(name="StudentAddress", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")
public class StudentAddress {
@Id
@Column(name = "address_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int address_id;
@Column(name = "address_detail")
private String address_detail;
@OneToMany(cascade=CascadeType.ALL,mappedBy = "studentAddress")
private List<Student3> students;
@Override
public String toString() {
return "StudentAddress [address_id=" + address_id + ", address_detail=" + address_detail + ", students="
+ students + "]";
}
public int getAddress_id() {
return address_id;
}
public void setAddress_id(int address_id) {
this.address_id = address_id;
}
public String getAddress_detail() {
return address_detail;
}
public void setAddress_detail(String address_detail) {
this.address_detail = address_detail;
}
public List<Student3> getStudents() {
return students;
}
public void setStudents(List<Student3> students) {
this.students = students;
}
public StudentAddress() {
}
}
On saving the data from Student3 object , I am able to save data like this:
But when I save data from StudentAddress side, I get a null in the student_address_id column:
Code to save data from Student3, studentAddress side:
/**************SAVE STUDENT Address Controller*************************/
@RequestMapping(value="/saveStudentAddress", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
public String savestudentaddress (@RequestBody StudentAddress s1) {
System.out.println(s1);
studentaddressRepository.save(s1);
return "success";
}
/**************SAVE STUDENT3 Controller*************************/
@RequestMapping(value="/saveStudent3", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
public String savestudent (@RequestBody Student3 s1) {
System.out.println(s1);
student3Repository.save(s1);
return "success";
}
Json to save data from Student3 side:
{
"student_id" :123,
"student_name": "avijit kumar Mamod",
"studentAddress":{
"address_id" : 123,
"address_detail" : "209 - Berlington Street"
}
}
Json to save data from StudentAddress side:
{
"address_id" : 123,
"address_detail" : "209 - Berlington Street",
"students": [{
"student_id" :123,
"student_name": "avijit kumar Mamod"
}]
}
Upvotes: 2
Views: 966
Reputation: 730
Now today, on removing mappedBy
from StudentAddress
side & putting @JoinColumn(name="student_address_id")
, when I tried to save from studentAddress
side, it did added value in DB student_address_id
.
studentAddress
looks like this now:
@OneToMany(cascade=CascadeType.ALL/*,mappedBy = "studentAddress"*/)
@JoinColumn(name="student_address_id")
private List<Student3> students;
I am not sure why this happened. I dont have extra code as suggested by abhi in above answer. Controller is very simple now:
@RequestMapping(value="/saveStudentAddress", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
public String savestudentaddress (@RequestBody StudentAddress s1) {
System.out.println(s1);
studentaddressRepository.save(s1);
return "success";
}
Upvotes: 1
Reputation: 398
Modify your saveStudentAddress code like below and try
@RequestMapping(value="/saveStudentAddress", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
public String savestudentaddress (@RequestBody StudentAddress s1) {
System.out.println(s1);
for(Student s: s1.getStudents()){
s.setAddress(s1);
}
studentaddressRepository.save(s1);
return "success";
}
Upvotes: 2