I have implemented one to many relationship (annotation) as follows:
// User Class
@Entity
@Table(name="user")
public class User {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email_id")
private String emailId;
@Column(name="password")
private String password;
@OneToMany(targetEntity=Address.class,cascade=CascadeType.ALL)
@JoinColumn(name="user_id", referencedColumnName="id")
private List
addresses;..... setters and getters
}
// Address Class
@Entity
@Table(name="address")
public class Address {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="add_id")
private Integer addId;
@Column(name="pin_code")
private String pinCode;
@Column(name="street")
private String street;
@Column(name="city")
private String city;
@Column(name="state")
private String state;
... setters and getters
}
The problem is that when I am saving User object (which also contains list of one Address object) with hibernate template, it is inserting null in foreign key column ("user_id") in address table.
It fires 2 insert statements for both the tables but it is NOT firing update statement to update foreign key column
But when I use SessionFactory it works as expected (below is the code of session factory):
SessionFactory factory = template.getSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
try{
//id = (Integer) template.save(user);
id = (Integer) session.save(user);
}catch(Exception e){
System.out.println(e);
id = -1;
}
transaction.commit();
session.close();
In above case it fire 2 insert and 1 update to update foreign key column
解决方案
Please check the below mapping
User.java
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Fetch(value = FetchMode.SELECT)
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
@JsonIgnore
private List
addressList ;//remaining fields and getter setters here
}
Address.java
@Entity
@Table(name="address")
public class Address {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="add_id")
private Integer addId;
@ManyToOne
@JoinColumn(name = "id", insertable = true, updatable = true, nullable = true)
private User user;
//remaining fields and getter setters here
}