java - 在 JPA @OneToMany 关系中更新 Set 元素的正确方法?

标签 java hibernate jpa orm set

假设我们有一个 双向一对多关系 父子之间。

我喜欢模型与 Set 关系的想法,因为它不允许重复的内在性质。

问题:
1) 什么是 正确的 JPA 方式 在这种情况下更新 child ?

  • 查询 Parent 并将更新的 Child 传递给它?
  • 直接查询 Child 并调用它的 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?
        }
    }
    

    更新:
    如何正确编写更新方法?由于 Java 中的 Sets 没有 get 方法?

    最佳答案

    更新 Child ,不需要操作父集合。

    感谢 dirty checking mechanism ,一旦Child在当前运行的 Persistence Context 中进行管理,每个更改都会自动选取并同步到数据库。

    这就是您没有 update 的原因JPA中的方法。你只有persist or mergeEntityManager .

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

  • 您加载了 Child通过身份证:
    Child child = entityManager.find(Child.class, childId);
    
  • Child 进行更改你就完成了:
    child.setName(newName);
    
  • 关于java - 在 JPA @OneToMany 关系中更新 Set 元素的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44004634/

    相关文章:

    java - 无法为我的实体生成 UUID ID

    java - JPA 或查询拦截

    java - 如何使用 log4j2 将日志保存到带有时间戳的文件中

    java - 如何找到 div 标签内的特定文本?

    java - 正则表达式奇数/偶数

    具有子图同构问题支持的 Java 库?

    java - 来自 ant 在 linux 中构建的 java 类的数据库

    spring - ReactiveCrudRepository 在 Spring 使用 Hibernate

    java - Hibernate native 查询 : Invalid Column Name Error SQL-17006

    java - 从数据库读取时 JPA 字符串为 boolean 值