代码之家  ›  专栏  ›  技术社区  ›  Harald

多个字段的休眠级联顺序-对象引用未保存的临时实例

  •  1
  • Harald  · 技术社区  · 7 年前

    我有以下实体

    class A {
        @OneToMany(cascade = ALL)
        List<B> b;
        @OneToMany(cascade = ALL)
        List<C> c;
    }
    
    class B {
        @ManyToOne
        A a
    }
    
    class C {
        @ManyToOne
        A a;
        @ManyToOne
        B b;
    }
    

    现在,当我在事务中执行以下代码时

    A a = repository.findOne(id);
    B b = new B();
    C c = new C();
    c.setB(b);
    a.addB(b);
    a.addC(c);
    repository.save(a);
    

    我从hibernate获得以下异常:

    object references an unsaved transient instance - save the transient instance before flushing
    

    如果我保存,我的代码可以工作 a 在我添加之后 b ,因为 b 在之前保存 c

    我猜persist的级联顺序很重要。有没有办法确保b在c之前级联?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Xavier Hammond    7 年前

    我可能错了,但我认为不可能确保您的Bs列表首先级联,这无论如何都不是最佳实践。

    我认为您最简单的选择是将cascade persist添加到从C到B的关系中。

    class C {
        @ManyToOne
        A a;
        @ManyToOne(cascade = PERSIST)
        B b;
    }