在级联持续父级之后,子级ID不存在

use*_*908 8 java hibernate jpa one-to-many

我有一个User(父)和Home(子)实体在单向一对多关系之后相关.

我的问题是,当向a添加一个新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() {
    }

}
Run Code Online (Sandbox Code Playgroud)

以及更新父级的代码:

Home home = HomeParser.parse(homeDTO);
User user = userService.findById(userId);
user.addHome(home);
userService.update(user); // delegate call to getEntityManager().merge(user);
Run Code Online (Sandbox Code Playgroud)

在这一点上,我假设我必须home拥有它在持久化到db时刚刚给出的id,但事实并非如此.

我已经尝试过添加insertable = false到Home的id了@Column,正如这里指出的那样,但它也不起作用.

Dra*_*vic 5

EntityManager.merge方法实现委托给 Hibernate Session.merge

将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,它将被加载。返回持久化实例。如果给定的实例未保存,则保存一个副本并将其作为新的持久实例返回。给定的实例不会与会话关联。如果关联与 映射,则此操作级联到关联的实例 cascade="merge"

注意粗体部分。基本上,merge操作将级联到Home您创建的实例,但 Hibernate 将创建该实例的副本,将您的实例合并到副本中,保存副本并用User.homes集合中的副本替换您的实例。

在此之后,User.homes集合应包含Home具有正确初始化 id的实例副本。