我有一个User
(家长)和一个Home
(子)实体遵循单向一对多关系相关。
我的问题是,当添加新的Home
to a 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
拥有在持久化到数据库时刚刚给出的 id,但事实并非如此。
我已经尝试添加insertable = false
到家庭的 id@Column
,如所指出的here https://stackoverflow.com/questions/32045577/childs-id-is-not-assigned-from-parent-on-persist,但它也不起作用。
EntityManager.merge
方法实现委托给 HibernateSession.merge https://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#merge%28java.lang.Object%29:
使用以下命令将给定对象的状态复制到持久对象上
相同的标识符。如果当前没有持久化实例
与会话关联,它将被加载。返回持久化的
实例。如果给定实例未保存,请保存 和 的副本
将其作为新的持久实例返回。给定的实例不
与会话关联。该操作级联到
关联实例(如果关联映射为)cascade="merge"
.
注意粗体部分。基本上,merge
操作将被级联到Home
您创建的实例,但 Hibernate 将创建该实例的副本,将您的实例合并到该副本中,保存该副本并将您的实例替换为User.homes
收藏。
在这之后,User.homes
集合应包含以下内容的副本Home
具有正确初始化的 id 的实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)