Java 使用级联持久化实体时获取子id

Java 使用级联持久化实体时获取子id,java,hibernate,Java,Hibernate,我正在使用hibernate实体管理器(4.2.16)。 在向现有实体添加新的子实体后,合并该实体时遇到问题。我想获取新创建的子项的id,但未设置id。 这是我的模型: @Entity @Table(name = "PARENT") @GenericGenerator(name = "gen_identifier", strategy = "sequence", parameters = { @Parameter(name = "sequence", value = "SQ_PARENT

我正在使用hibernate实体管理器(4.2.16)。 在向现有实体添加新的子实体后,合并该实体时遇到问题。我想获取新创建的子项的id,但未设置id。 这是我的模型:

@Entity
@Table(name = "PARENT")
@GenericGenerator(name = "gen_identifier", strategy = "sequence", parameters = {
    @Parameter(name = "sequence", value = "SQ_PARENT")
})
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_identifier")
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent")
    private Set<Child> children;
}

@Entity
@Table(name = "CHILD")
@GenericGenerator(name = "gen_identifier", strategy = "sequence", parameters = {
    @Parameter(name = "sequence", value = "SQ_CHILD")
})
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_identifier")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    private Parent parent;
}
添加子事务的代码(事务2)

在执行代码时,我希望子id不为null。以下是我得到的输出:

saveParent : parent.id = 1000
addChild : parent.id = 1000
addChild : child.id = null
addChild : child.id = null

Merge总是返回一个新初始化的实体,您应该使用它作为您操作的实体。调用Merge后发生的所有更改都只反映在Merge返回的实体中。因此,为了解决您的问题,您需要更改代码,如下所示

public Parent addChild(Parent parent) {
Child child = new Child();
child.setParent(parent);
parent.getChildren().add(child);

parent=entityManager.merge(parent);
System.out.println("addChild : parent.id = " + parent.getId());

// The following give me a null id
System.out.println("addChild : child.id = " + parent.getChildren().iterator().next().getId());

System.out.println("addChild : child.id = " + child.getId());'
return parent;
}

您还应该从此方法返回父级,以便调用此方法的任何代码都应该使用新生成的父级,而不是使用旧的父级,因为旧的父级中没有通过合并进行任何更改

要阅读有关merge()的更多信息,请访问下面的链接

saveParent : parent.id = 1000
addChild : parent.id = 1000
addChild : child.id = null
addChild : child.id = null
public Parent addChild(Parent parent) {
Child child = new Child();
child.setParent(parent);
parent.getChildren().add(child);

parent=entityManager.merge(parent);
System.out.println("addChild : parent.id = " + parent.getId());

// The following give me a null id
System.out.println("addChild : child.id = " + parent.getChildren().iterator().next().getId());

System.out.println("addChild : child.id = " + child.getId());'
return parent;