JPA-Hibernate:抽象类集合引发"对象引用未保存的瞬态实例"例外

时间:2017-10-10 14:24:18

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

不重复

总结一下这个问题:

我有一个Order实体,其列表为Menu,每个Menu都有一个Item列表,这是一个抽象类。有关详细信息,请参阅下文。

摘要classe:

 @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子类,所以它应该使用它们。

任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

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

菜单&lt; - &gt; MenuItem&lt; - &gt;项目

新的MenuItem实体将包含菜单和项目的主键。

Many to Many example