jpa(休眠)一对多刷新不会刷新多边集合

时间:2015-10-30 08:59:52

标签: java spring hibernate jpa

我有这个复杂的数据模型。 A类有B,C,D类型的集合。 E是D和C之间的连接表.F是D和B之间的连接表。

我从D(cascade.All)中保存了E和F.由于E包含对C的引用而F包含对B的引用,因此在继续保存D之前,我需要将它们保存(id生成)。

所以这是我的保存令。

  1. saveAndFlush(A)(我希望声明冲洗A(B和C),因为它们应该从A级联。

  2. 保存(D)当我运行它时,我得到以下异常。

  3. 引起:java.lang.IllegalStateException:org.hibernate.TransientPropertyValueException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:E.c - > ç

    我在第2步之前检查了eclipse中的集合a.bSet和a.cSet,集合中的那些元素没有生成Id。

    我尝试将第1步拆分为

    1. saveAndFlush(A)
    2. saveAndFlush(a.bSet)
    3. saveAndFlush(a.cSet)
    4. saveAndFlush(a.dSet)但我得到了相同的例外。
    5. 我还尝试使用@Transactional(propagation = REQUIRES_NEW)将1,2,3移动到不同的服务方法,但仍然是同样的问题。

      非常感谢任何帮助。

      class A{
          @OneToMany(mappedBy = "a", cascade={CascadeType.ALL}, orphanRemoval=true)
          @JsonIgnore
          @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
          private Set<B> bSet = new HashSet<>();
      
          @OneToMany(mappedBy = "a", cascade={CascadeType.ALL}, orphanRemoval=true)
          @JsonIgnore
          @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
          private Set<C> cSet = new HashSet<>();
      
          @OneToMany(mappedBy = "a", cascade={CascadeType.REMOVE , CascadeType.DETACH}, orphanRemoval=true)
          @JsonIgnore
          @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
          private List<D> dSet = new ArrayList<>();
      }
      
      class B{
          @ManyToOne
          private A a;
      }
      
      class C{
          @ManyToOne
          private A a;
      }
      
      
      class D{
      
          @OneToMany(mappedBy = "d", cascade = CascadeType.ALL)
          @JsonIgnore
          @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
          private Set<E> e = new HashSet<>()
      
          @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "d")
          private F f;
      
          @ManyToOne
          private A a;
      }
      
      /*E is join table between D and C*/
      
      class E{
          @ManyToOne
          private D d;
      
          @ManyToOne
          private C c;
      }
      
      /*F is join table between D and B*/
      class F{
          @OneToOne
          @JoinColumn(name="d_id")
          private D d;
      
          @ManyToOne
          private B b;
      }
      

0 个答案:

没有答案