gpt4 book ai didi

java - 使用 JPA 以一对多方式添加子项时未返回 ID

转载 作者:行者123 更新时间:2023-12-01 12:39:30 24 4
gpt4 key购买 nike

我在两个类之间有一个经典的一对多父子关系。初始创建时,我创建一个 ID = 0 的父级和一个 ID = 0 的子级。然后,我在子级中添加对父级的引用,然后将子级添加到父级列表中。我使用下面的代码进行保存,父级和子级都使用新 ID 保存在数据库中,并且生成的父级和子级 bean 都具有在 bean 中指定的 ID。

当我向现有的分离 bean 添加额外的子 bean 时,我创建新的子 bean,设置 ID = 0,将父代设置为引用,然后将其添加到父代的列表。然后,我运行下面列出的编辑代码,数据库显示新子 bean 已使用新 ID 保存到数据库中,但新子 bean 不显示新 ID...

在向这种关系中添加新 child 时,我应该采取哪些不同的做法?

父类:

class parent
{

@GeneratedValue( strategy = GenerationType.IDENTITY )
private Integer id;

@OneToMany( mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER )
private List<Child> childList;
}

子类:

class child
{
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Integer id;

@ManyToOne( fetch = FetchType.EAGER, cascade = CascadeType.ALL )
@JoinColumn( name = "ID_PARENT", nullable = false )
private Parent parent;
}

保存初始代码:

Parent parent = new Parent();
parent.setID( 0 );

Child child = new Child( );
child.setID( 0 );
child.setParent( parent );

List<Child> childList = new List<>();
childList.add( child );
parent.addChildList( childlist );

em.persist( parent );
em.flush();

parent.getID(); // will display ID in db
parent.getChildList(0).getID(); // will have ID from database

编辑代码:

addChild( Parent detachedParent )
{

Child child = new Child( );
child.setID( 0 );
child.setParent( detachedParent );

detachedParent.getChildList().add( child );

em.merge( detachedParent );
em.flush();

parent.getID(); // will display ID in db
parent.getChildList( 0 ).getID(); // will have ID from database
parent.getChildList( 1 ).getID(); // will be 0, but database has new ID
}

最佳答案

当您使用 em.persist() 时,它会修改您作为参数传递的对象,但是当您使用 em.merge() 时,它会从以下位置加载一个新副本: DB 并合并作为参数传递的对象的更改,然后返回该合并的对象。在您的情况下,您检查传递给 em.merge() 的对象,该对象未被调用修改,您必须将 merge 的返回值分配给一个变量,然后从该父级访问子级已添加。

addChild( Parent detachedParent )
{
Child child = new Child( );
child.setID( 0 );
child.setParent( detachedParent );

detachedParent.getChildList().add( child );

parent = em.merge( detachedParent ); // assign merged copy to parent
em.flush();

parent.getID(); // will display ID in db
parent.getChildList( 0 ).getID(); // will have ID from database
parent.getChildList( 1 ).getID(); // should display same id as the one from DB
}

关于java - 使用 JPA 以一对多方式添加子项时未返回 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252995/

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