Hibernate 冬眠:一家公司通过级联拯救儿童

Hibernate 冬眠:一家公司通过级联拯救儿童,hibernate,one-to-many,cascade,hibernate-annotations,Hibernate,One To Many,Cascade,Hibernate Annotations,在父类中有一个列表。保存父级时,应通过hibernate保存/更新已添加或更改的子级 我已经找到了很多关于这一点的解释,然而,我就是不想让它起作用 Parent.class尝试 @Entity public class Parent { // id and other attributes @OneToMany(mappedBy = "parent") @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType

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

我已经找到了很多关于这一点的解释,然而,我就是不想让它起作用

Parent.class尝试

@Entity
public class Parent {
// id and other attributes
@OneToMany(mappedBy = "parent")
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
protected List<child> children;
但是,在刷新时,我得到以下错误:

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只级联它所发布的内容。在这种情况下,您将发出一个“保存更新”,然后将其级联到子级。我猜你希望Hibernate聪明,并为这里的孩子们坚持下去。但这不是Hibernate在这里的工作方式,我以前也遇到过类似的情况。有点让人困惑,但如果您了解了级联的工作原理,您就会看到这种情况。

我需要一种方法将一个实体与一个新的联接(子)实体插入到一起。一种方法是分离操作(例如,先保存连接的实体,然后保存主实体)。 但是,Hibernate支持插入具有新连接实体的新实体。
请参见一个示例:

您的父类try A似乎已经正确。但要在保存父级时级联子级,必须将级联放在所有者端(在一对多中,是具有外键的实体)

试试这个

@Entity
public class Parent {
    @OneToMany(mappedBy = "parent")
    protected List<Child> children;
}
试试这个:

@Entity
@Table(name = "TABLE_PARENT")
public class Parent{
    @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
    private List<Child> children;
}

@Entity
@Table(name = "TABLE_CHILD")
public class Child{
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="PARENT_ID")
    private Parent parent;
}
@实体
@表(name=“表\父表”)
公共类父类{
@OneToMany(mappedBy=“parent”,cascade=CascadeType.PERSIST)
私人名单儿童;
}
@实体
@表(name=“Table\u CHILD”)
公营儿童{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“PARENT\u ID”)
私人家长;
}
用法

public void save(){
父项=新父项();
List children=new ArrayList();
子项=新子项();
setParent(家长);
添加(child);
父母、子女(子女);
parentRepository.save(父级);
}

注意:别忘了在子对象上设置父对象,否则您将得到表\u child.parent\u ID null/empty

这只是一种方法,经过多次实验后,我可以按预期工作(保存子实体并自动创建关系)。我希望这会有帮助

@实体
公共类父类{
@身份证
私人长id;
@JoinColumn(name=“parentId”)
@OneToMany(cascade=CascadeType.ALL,orphan=true)
私人儿童;
}
@实体
公营儿童{
@身份证
私人长id;
私人长父ID;
}

在保存之前,发布子对象的代码以及如何构建对象。这样做有效吗?对我来说,当
Parent
尚未持久化时,它不起作用!因此,真正的解决方案看起来是:在事务-保存父对象中,使用链接父对象保存子对象
@Entity
public class Parent {
    @OneToMany(mappedBy = "parent")
    protected List<Child> children;
}
@Entity
public class Child {
    @ManyToOne
    @Cascade(value={org.hibernate.annotations.CascadeType.ALL})
    @JoinColumn(name="PARENT_ID")
    protected Parent parent;
}
@Entity
@Table(name = "TABLE_PARENT")
public class Parent{
    @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
    private List<Child> children;
}

@Entity
@Table(name = "TABLE_CHILD")
public class Child{
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="PARENT_ID")
    private Parent parent;
}
public void save(){
  Parent parent = new Parent();
  List<Child> children = new ArrayList<>();
  Child child = new Child();
  child.setParent(parent);
  children.add(child);
  parent.setChildren(children);

  parentRepository.save(parent);
}