当前位置: 首页 > 面试题库 >

Hibernate:OneToMany通过级联拯救孩子

路和悌
2023-03-14
问题内容

父类中有一个列表List。保存父项后,已添加或更改的子项应通过hibernate保存/更新。

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

Parent.class试试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

@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;

孩子被添加到新的父母。之后两者都保存

sessionFactory.getCurrentSession().saveOrUpdate(parent);

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

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)

有人看到我的错误吗?

非常感谢!!


问题答案:

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

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

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

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



 类似资料:
  • 我在android应用程序中使用Stripe。目前,客户机服务器用于创建客户和对卡收费。 现在我想在应用程序中保存条带返回的卡信息,并在自定义ui中显示支付方式中添加的卡的列表,以便更新、删除和选择默认卡。 我浏览了stripe的临时密钥文档,他们提供了显示卡细节的活动。但是我找不到如何在自定义ui中显示卡片列表。 有没有其他方法可以实现这一点,例如在本地保存卡信息? 条纹是否允许自定义卡片列表等

  • 我和JNI有一个Android项目。在实现侦听器类的CPP文件中,有一个回调x()。调用x()函数时,我想调用java类中的另一个函数。然而,为了调用该java函数,我需要访问JNIEnv*。 我知道在回调的同一个cpp文件中,有一个函数: 当

  • 我想要一份有团队成员的团队名单 (我正在用java编写示例代码,但解决方案不必使用java。) 像这样: 如果我想访问一个团队的所有成员,那将是非常直接的<但是如果我想看看一个成员是哪个团队的成员呢<我不想每次都对所有团队成员进行循环。 我可以在成员的班级里拯救每个成员的团队,但这不是有点愚蠢吗?

  • 尝试拯救回调 有几种回调的设计试图解决一些(不是全部!)我们刚才看到的信任问题。这是一种将回调模式从它自己的崩溃中拯救出来的勇敢,但注定失败的努力。 举个例子,为了更平静地处理错误,有些API设计提供了分离的回调(一个用作成功的通知,一个用作错误的通知): function success(data) { console.log( data ); } function failure(er

  • 我在科特林开始了我的第一个Android项目。官方文件建议我使用我使用的房间。 在添加空间后,我无法编译我的项目。 关于错误的额外信息 kotlin 和 room 的版本是: ext.kotlin_version='1.2.31' ext.room_version='1.0.0' 我的 gradle.build 依赖项如下所示: 我还在文件顶部添加了: 这是我的刀: 我尝试的是: 更改静态编程语言

  • 通过nhibernate保存父对象的子对象有时只会导致不在表中插入子对象。这种方法在大多数情况下都有效,但在数千次中,只有几次孩子失踪。 这是一个大型多线程应用程序。 以下是子映射: 和儿童班: 父映射: 下面是父类 添加父项和子项的代码如下所示: 检查调用方是否已开始事务的机制似乎没有任何错误,并且调用方在不抛出异常并记录它的情况下不会回滚。我没有发现任何交易被回滚的痕迹。 父映射中的级联选项有