我的实体之间有一个复杂的层次结构。由于一个错误(见下文),我在许多地方放入了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
如果不深入研究规范,我不太确定这一点,但我猜这种情况会发生:
假设如下:如果F是持久化的,则持久化通过C和D级联到E。
然而,OpenJPA扫描F并看到两个关系:F.c
和F.e
。它将持久化级联到C,但是由于F.E
没有标记为级联,OpenJPA还不知道E是否也会被持久化(因为它没有处理F)。这样你就得到了错误。
对于重复持久化问题,您可以尝试对图进行一点破坏。考虑拥有方:F拥有与C和E的关系,E拥有与D的关系,D拥有与C的关系。
因此,如果持久化C,级联将包括F,然后该级联将包括E和D。D无论如何都将被持久化,因此您不需要在C.D
上进行级联,这可能会导致重复。我将尝试删除c.d
和d.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