当前位置: 首页 > 知识库问答 >
问题:

如何消除级联。所有在一个JPA关系?

郎翔
2023-03-14

我的实体之间有一个复杂的层次结构。由于一个错误(见下文),我在许多地方放入了cascade.all或cascade.persisted。从上到下,注释都可以。但自下而上,不是我想要的。

它会导致对象被重复保存。

我如何解决这个问题??

   public A convertToA(final QueryAType aType, final A parent) {
        final A a = new A();

        if (parent != null) {
            a.setVater(parent);
        }

        final List<A> children = new ArrayList<A>();
        for (final QueryAType childPart : aType.getUnterbauteil()) {
            children.add(convertToA(childPart, a));
        }

        final List<B> bList = new ArrayList<B>();
        for (final QueryBType bType : aType.getBType()) {
            bList.add(convertToB(bType, a));
        }
        a.setBList(bList);
        a.setKinder(children);
        return a;
    }

    public B convertToB(final QueryBType bType, final A a) {
        final B b = new B();
        b.setA(a);

        final List<C> cList = new ArrayList<C>();
        for (final QueryCType cType : bType.getCType()) {
            cList.add(convertToC(cType, b));
        }
        b.setCList(cList);
        return b;
    }

    public C convertToC(final QueryCType cType, final B b) {
        final C c = new C();
        c.setB(b);

        final List<D> dList = new ArrayList<D>();
        for (final QueryDType dType : cType.getDType()) {
            dList.add(convertToD(dType, c));
        }
        c.setDList(dList);
        return c;
    }

    public D convertToD(final QueryDType dType, final C c) {
        final D d = new D();
        d.setProbe(c);

        final List<E> eList = new ArrayList<E>();
        for (final QueryEType eType : dType.getEType()) {
            eList.add(convertToE(eType, d, c));
        }

        d.setEList(eList);

        return d;
    }

    public E convertToE(final QueryEType eType, final D d, final C c) {
        final E e = new E();
        e.setD(d);

        final List<F> fList = new ArrayList<F>();
        for (final QueryFType fType : eType.getFType()) {
            fList.add(convertToF(fType, e, c));
        }
        e.setFList(fList);
        c.setFList(fList);
        return e;
    }

    public F convertToF(final QueryFType fType, final E e, final C c) {
        final F f = new F();
        f.setC(c);
        f.setE(e);

        final List<G> gList = new ArrayList<G>();
        for (final QueryGType gType : fType.getGType()) {
            gList.add(convertToG(gType, f));
        }
        f.setGList(gList);

        return f;
    }

    public G convertToG(final QueryGType gType, final F f) {
        final G g = new G();
        g.setMethode(f);
        return g;
    }

无级联错误:

InvalidStateException:在刷新期间通过字段“com.xxx.yyy.data.entity.f.e”级联持久性时,遇到了处于生命周期状态的非托管对象“com.xxx.yyy.data.entity.e@18E0A217”。但是,此字段不允许级联持久化。不能刷新非托管对象或与非托管对象有持久关联的图。建议的操作:a)将此字段的cascade属性设置为cascadetype.persist或cascadetype.all(JPA注释)或“persist”或“all”(JPA orm.xml),b)全局启用cascade-persist;c)在刷新之前手动持久化相关字段值。d)如果引用属于另一个上下文,通过设置storeContext.setAllowReferenceTosiblingContext()允许引用它。failedObject:com.xxx.yyy.data.entity.e@18E0A217

共有1个答案

融宏伟
2023-03-14

如果不深入研究规范,我不太确定这一点,但我猜这种情况会发生:

假设如下:如果F是持久化的,则持久化通过C和D级联到E。

然而,OpenJPA扫描F并看到两个关系:F.cF.e。它将持久化级联到C,但是由于F.E没有标记为级联,OpenJPA还不知道E是否也会被持久化(因为它没有处理F)。这样你就得到了错误。

对于重复持久化问题,您可以尝试对图进行一点破坏。考虑拥有方:F拥有与C和E的关系,E拥有与D的关系,D拥有与C的关系。

因此,如果持久化C,级联将包括F,然后该级联将包括E和D。D无论如何都将被持久化,因此您不需要在C.D上进行级联,这可能会导致重复。我将尝试删除c.dd.e上的级联。

 类似资料:
  • 问题内容: 我是SQL新手,遇到了一个奇怪的问题。所以我有两个表OFFERS和SUPPLIER。这是供应商表。 这是OFFERS表。 所以现在,当我尝试像这样向offers表添加外键约束时 我收到一条错误消息:“ ORA-01735:无效的ALTER TABLE选项”。如果我删除最后一行,即“ ON UPDATE CASCADE”,则可以正常工作。那么,我在做什么错呢?我在互联网上看到了很多类似的

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 问题内容: 在一个模型中,我有这个: 如果我选择: 有用。 如何从关系中删除所有对象?不管用。 问题答案: 首先,你需要使用或来清除关系,根据docs,哪种更适合你的需求。 之后,你需要使用删除对象。方法。

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 这就是我在教师实体中所拥有的: 现在我喜欢使用数据库的功能。重复一遍:数据库的删除级联功能只针对Student_Teacher-table! 问题是: 问题是:这很好,但是要触发删除中的条目,我必须在两边指定。Hibernate不解析,只看到,并将目标实体(和引用的学生)从缓存中删除,但它们仍然在数据库中!!!因此,我不得不在空降后彻底清除Hibernate期,重新阅读教师、傅太太、巴尔先生和学生

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa