Java jpa(hibernate)一对多刷新不是刷新多方集合

Java jpa(hibernate)一对多刷新不是刷新多方集合,java,spring,hibernate,jpa,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已生成) 这就是我的储蓄顺序 saveAndFlush(A)(我希望语句刷新A(B和C),因为它们应该从A级联而来) 保存(D)当我运行它时,我得到以下异常 原因:java.lang.IllegalStateException:org.hibernate.Transi

我有一个复杂的数据模型。A类有B、C、D类型的集合。E是D和C之间的联接表。F是D和B之间的联接表

我正在从D(cascade.All)保存E和F。因为E包含对C的引用,F包含对B的引用,所以我需要在继续保存D之前将它们都保存(id已生成)

这就是我的储蓄顺序

  • saveAndFlush(A)(我希望语句刷新A(B和C),因为它们应该从A级联而来)

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

  • 原因:java.lang.IllegalStateException:org.hibernate.TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例:E.c->c

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

    我尝试将步骤1拆分为

  • 保存和刷新(A)
  • saveAndFlush(a.bSet)
  • saveAndFlush(a.cSet)
  • saveAndFlush(a.dSet),但我得到了相同的异常
  • 我还尝试使用@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;
    }
    
    A类{
    @OneToMany(mappedBy=“a”,cascade={CascadeType.ALL},orphanRemoving=true)
    @杰索尼奥雷
    @缓存(用法=缓存并发策略。非严格读写)
    私有集bSet=newhashset();
    @OneToMany(mappedBy=“a”,cascade={CascadeType.ALL},orphanRemoving=true)
    @杰索尼奥雷
    @缓存(用法=缓存并发策略。非严格读写)
    私有集cSet=newhashset();
    @OneToMany(mappedBy=“a”,cascade={CascadeType.REMOVE,CascadeType.DETACH},orphanremove=true)
    @杰索尼奥雷
    @缓存(用法=缓存并发策略。非严格读写)
    private List dSet=new ArrayList();
    }
    B类{
    @许多酮
    私人A;
    }
    C类{
    @许多酮
    私人A;
    }
    D类{
    @OneToMany(mappedBy=“d”,cascade=CascadeType.ALL)
    @杰索尼奥雷
    @缓存(用法=缓存并发策略。非严格读写)
    私有集e=新哈希集()
    @OneTONE(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“d”)
    私人基金;
    @许多酮
    私人A;
    }
    /*E是D和C之间的联接表*/
    E类{
    @许多酮
    私家侦探;
    @许多酮
    私人C C;
    }
    /*F是D和B之间的联接表*/
    F类{
    @奥内托内
    @JoinColumn(name=“d_id”)
    私家侦探;
    @许多酮
    私人B,;
    }
    
    该错误表明您创建的关联尚未在数据库中持久化。还要检查关系中的mappedBy属性,它显示关系所有者的名称,并且应该出现在反向引用中,即反向引用中。还应将级联属性放在关系所有者的末尾。确保在所有情况下都设置了关系的双方。a、 添加(d);d、 刚毛(a);阿兰海伊:我正在建立双方的关系。但是仍然看到了这个问题。@VivekSingh cascade已经就位。但是,主关系侧不应出现“不工作映射人”,而“映射人”用于显示反向侧的关系。