我有一个User
(父)和Home
(子)实体在单向一对多关系之后相关。
我的问题是,在向Home
添加新的User
时,新创建并保留的Home
没有id
。这是正常的吗?如果我想要id,我是否需要手动保留孩子?
这些是我的实体:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "firstName")
private String firstName;
@NotNull
@Column(name = "lastName")
private String lastName;
@NotNull
@Column(name = "email")
private String email;
@OneToMany(targetEntity = Home.class, fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)
@JoinColumn(name = "userId", referencedColumnName = "id", nullable = false)
private List<Home> homes;
public User() {
}
public void addHome(Home home) {
homes.add(home);
}
}
@Entity
@Table(name = "home")
public class Home implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "isActive")
private Boolean isActive;
public Home() {
}
}
更新父母的代码:
Home home = HomeParser.parse(homeDTO);
User user = userService.findById(userId);
user.addHome(home);
userService.update(user); // delegate call to getEntityManager().merge(user);
此时我假设我会home
拥有在持久保存到db时刚刚给出的id,但它没有。
我已经尝试将insertable = false
添加到主页的@Column
here,但它也不起作用。
答案 0 :(得分:4)
EntityManager.merge
方法实现委托给Hibernate Session.merge
:
使用。将给定对象的状态复制到持久对象上 相同的标识符如果当前没有持久化实例 与会话相关联,它将被加载。返回持久性 实例。 如果给定的实例未保存,请保存和的副本 将其作为新的持久化实例返回。给定的实例没有 与会话相关联。此操作级联到 关联映射的关联实例
cascade="merge"
。
注意粗体部分。基本上,merge
操作将级联到您创建的Home
实例,但Hibernate将创建该实例的副本,将您的实例合并到副本中,保存副本并用副本替换您的实例在User.homes
集合中。
在此之后,User.homes
集合应包含具有正确初始化ID的Home
实例的副本。