问题描述
我实现了一对多关系(注释),如下所示:
I have implemented one to many relationship (annotation) as follows:
//用户类别
@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<Address> addresses;
..... setters and getters
}
//地址类别
@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
}
问题在于,当我使用休眠模板保存 User 对象(还包含一个 Address 对象的列表)时,它会插入 null 地址表中外键列("user_id")中的"strong>".
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.
这两个表都触发 2条插入语句,但不触发更新语句来更新外键列
It fires 2 insert statements for both the tables but it is NOT firing update statement to update foreign key column
但是当我使用 SessionFactory 时,它可以正常工作(下面是会话工厂的代码):
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();
在上述情况下,它会触发 2次插入和1次更新来更新外键列
In above case it fire 2 insert and 1 update to update foreign key column
推荐答案
请检查下面的映射
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<Address> 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
}
这篇关于Spring Hibernate使用Hibernate模板在外键列中一对多插入null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!