gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:17:10 24 4
gpt4 key购买 nike

我正在使用 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;
}

创建父级的代码(事务 1):

public Long saveParent() {
Parent parent = new Parent();

entityManager.persist(parent);

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

添加子项的代码(事务 2)

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

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());
}

执行代码时,我希望子 ID 不为空。这是我得到的输出:

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

最佳答案

合并总是返回一个新初始化的实体,您应该将其用作操作的实体。调用合并后发生的所有更改仅反射(reflect)在从合并返回的实体中。因此,为了解决您的问题,您需要更改你的代码如下

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() 的更多信息,请访问以下链接

http://blog.xebia.com/jpa-implementation-patterns-saving-detached-entities/

关于java - 使用级联持久化实体时获取子id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38187983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com