Java 在JPA@OneToMany关系中更新集合元素的正确方法?

Java 在JPA@OneToMany关系中更新集合元素的正确方法?,java,hibernate,jpa,orm,set,Java,Hibernate,Jpa,Orm,Set,让我们假设父母和孩子之间有一个双向的一对多关系 我喜欢用集合来建模这种关系的想法,因为它具有不允许重复的内在本质 问题: 1) 在这种情况下,正确的JPA方法是什么 查询父级并将更新的子级传递给它 直接查询子级并只调用其setter 2) 无论哪种方式,性能都有一些优点或缺点 @Entity public class Parent extends AbstractPersistable<Long> { @OneToMany(cascade = CascadeType.A

让我们假设父母和孩子之间有一个双向的一对多关系

我喜欢用集合来建模这种关系的想法,因为它具有不允许重复的内在本质

问题:
1) 在这种情况下,正确的JPA方法是什么

  • 查询父级并将更新的子级传递给它
  • 直接查询子级并只调用其setter
2) 无论哪种方式,性能都有一些优点或缺点

@Entity
public class Parent extends AbstractPersistable<Long> {

    @OneToMany(cascade = CascadeType.ALL, ... )
    private Set<Child> children = new HashSet();

    public void addChild( Child child ) { ... }
    public void removeChild( Child child ) { ... }

    // non-anemic domain model ?
    public void updateChild( Child child ) {
        // how to update the element in the Set?
    }
}
@实体
公共类父级扩展了可抽象持久化{
@OneToMany(级联=级联类型.ALL,…)
private Set children=new HashSet();
public void addChild(Child-Child){…}
public void removeChild(Child){…}
//非贫血区域模型?
public void updateChild(子项){
//如何更新集合中的元素?
}
}
更新:

如何正确编写更新方法?由于Java中的集合没有get方法来更新子集合,因此不需要操作父集合

由于,一旦
子项在当前运行的持久性上下文中得到管理,每个更改都会自动拾取并同步到数据库

这就是为什么在JPA中没有
update
方法的原因。只有在
EntityManager
中才有

因此,您需要执行以下步骤:

  • 您可以按id加载
    子项

    Child child = entityManager.find(Child.class, childId);
    
  • 子项进行更改后,您就完成了:

    child.setName(newName);
    

  • 不会对你的表现产生任何影响。方法取决于数据的连接方式。但我认为这两者都可以,这取决于你想为infos做什么Hanks Vlad!