【问题标题】:JPA-Hibernate : Abstract class collection raises "object references an unsaved transient instance" exceptionJPA-Hibernate:抽象类集合引发“对象引用未保存的瞬态实例”异常
【发布时间】:2017-10-10 14:24:18
【问题描述】:

不重复

总结问题:

我有一个Order 实体,它有一个Menu 列表,每个Menu 都有一个Item 列表,它是一个抽象类。详情见下文。

抽象类:

 @Entity
 @Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
 public abstract class Item implements Serializable{
   @Id
   @GeneratedValue( strategy = GenerationType.TABLE,generator = "ItemIDGenerator" )
   @TableGenerator( table = "SEQUENCES", name = "ItemIDGenerator" )
   protected Long id;

  //.....
}

还有我的具体课程:

@Entity
public class ItemA extends Item{
}

@Entity
public class ItemB extends Item{
}

@Entity
public class ItemC extends Item{
}

这些具体实体的表已经存在于数据库中。

然后:

@Entity
public class Menu implements Serializable{
  @Id
  @GeneratedValue( strategy = GenerationType.AUTO )
  private Long          id;

  //one directional relation
  @OneToMany( fetch = FetchType.EAGER, orphanRemoval = false )
  @JoinTable( name = "menu_item", joinColumns = { @JoinColumn( name = "ID_MENU", referencedColumnName = "id" ) }, inverseJoinColumns = {@JoinColumn( name = "ID_ITEM", referencedColumnName = "id" ) } )}
  private List<Item> items;//problem is here 

  //bi-directional
  @ManyToOne(cascade = CascadeType.PERSIST )
  @JoinColumn( name = "ID_ORDER", referencedColumnName = "id", unique = false )
  private Order   order;
}

最后:

@Entity
public class Order implements Serializable {
    @Id
    @GeneratedValue( strategy = GenerationType.AUTO )
    private Long         id;

    @OneToMany( mappedBy = "order", orphanRemoval = true )
    private List<Menu>   menus;
}

问题是当我坚持 Menu 实体时,我有这个异常:

object references an unsaved transient instance - save the transient instance before flushing: org.domain.project.model.Item

消息很清楚,但我不知道如何继续,因为当应用程序启动时,所有具体类都在数据库中初始化。 如何告诉 JPA/Hibernate 所有 Item 子类都已保存,因此应该使用它们。

任何帮助。谢谢

【问题讨论】:

  • 发布您构建并保存新菜单的代码。
  • @AlanHay 即使你的评论很笼统,它也能帮助我找到我的错误。我通过在我的项目列表中添加一个新项目来进行测试,我没有从数据库中加载它们,所以它们的 ID 在 null ! .....我的错误[-_-]
  • 通常在child obj(mapping object)为null时会出现这个问题
  • @soorapadman 完全正确

标签: java hibernate jpa spring-boot spring-data-jpa


【解决方案1】:

您可能需要使用多对多关系,如果您想从菜单中而不是所有菜单中删除项目,这也将提供更大的灵活性。

菜单 MenuItem 项目

新的 MenuItem 实体将具有菜单和项目的主键。

Many to Many example

【讨论】:

  • 我的子实例(子类)已经被持久化了。所以我不想再坚持他们。我只想坚持 Menu 而不进行级联,因为它们已经存在。
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 2021-03-03
  • 2016-06-02
  • 2022-01-02
  • 2020-06-24
  • 2018-04-01
  • 2012-02-19
  • 2014-10-26
相关资源
最近更新 更多