休眠:OneToMany通过级联拯救孩子 [英] Hibernate: OneToMany save children by cascade

查看:102
本文介绍了休眠:OneToMany通过级联拯救孩子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在父类中有一个列表列表.保存父项后,已添加或更改的子项应由休眠保存/更新.

In the class Parent there is a list List. When the parent is saved the children which have been added or changed shall be save / updated by hibernate.

我找到了很多解释,但是,我只是没有使它起作用.

I've found many explanations on this, however, I just don't get it to work.

Parent.class试试A

Parent.class try A

@Entity
public class Parent {
// id and other attributes
@OneToMany(mappedBy = "parent")
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
protected List<child> children;

Parent.class尝试B

Parent.class try B

@Entity
public class Parent {
// id and other attributes
  @OneToMany(mappedBy = "parent", cascade = { javax.persistence.CascadeType.ALL },
 orphanRemoval = true)
 @org.hibernate.annotations.Cascade({ 
 org.hibernate.annotations.CascadeType.PERSIST,
 org.hibernate.annotations.CascadeType.MERGE,
 org.hibernate.annotations.CascadeType.REFRESH,
 org.hibernate.annotations.CascadeType.SAVE_UPDATE,
 org.hibernate.annotations.CascadeType.REPLICATE,
 org.hibernate.annotations.CascadeType.LOCK,
 org.hibernate.annotations.CascadeType.DETACH })
protected List<child> children;

孩子被添加到新的父母.之后,两者均保存为

children are added to a new parent. Afterwards both are saved by

sessionFactory.getCurrentSession().saveOrUpdate(parent);

但是在冲洗时,出现以下错误:

when flushing, though, I get the following error:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: de.pockettaxi.backend.model.ride.RideSingle
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:265)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:295)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3378)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:520)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:230)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:154)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)

有人看到我的错误吗?

非常感谢!!

推荐答案

我想,如果您回答第一个评论中的问题,我们将遇到这种情况:

I guess if you answer the question from the first comment, we will come to this situation:

  • 您已经有一个永久的父母
  • 您有尚未持久的新子对象
  • 您将子级添加到父级并执行saveOrUpdate

在那种情况下,休眠只是将保存或更新级联到子级,但是由于它们尚未持久,因此无法保存或更新.现在,Hibernate只是说我无法更新非持久性实体"

In that case hibernate just cascades the save or update to the children, but they cannot be saved or updated as they have not been persistent yet. And now Hibernate says simply "I cannot update a non persistent entity"

用一句话:Hibernate只级联它发出的要级联的内容.在这种情况下,您发出一个"SAVE_UPDATE" ,它被级联,然后扩展到子级.我想您希望Hibernate变得聪明,并转而为这里的孩子坚持下去.但这不是Hibernate在这里工作的方式,我之前也遇到过类似的情况.有点令人困惑,但是如果您一旦了解了级联的工作原理,就会看到这种情况.

In one sentence: Hibernate only cascades what it is issued to cascade. In this case you issue a "SAVE_UPDATE", which is cascaded then further to the children. I guess you expected Hibernate to be smart and switch to persist for the children here. But this is not how Hibernate works here, I came across similar situations before, too. A bit confusing, but if you once got how cascading works, you will see such situations.

这篇关于休眠:OneToMany通过级联拯救孩子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆