2017-10-10 80 views
0

不重複JPA的休眠:抽象類集合提出了「對象引用一個未保存的瞬態的實例」異常

總結問題:

我有有Menu和每個列表的Order實體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; 
} 

問題是,當我persit一個Menu實體我有這樣的例外:

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

的信息是明確的,但我不由於所有的具體類都是在應用程序啓動時在數據庫中初始化的,因此不會看到如何進行RTS。 如何告訴JPA /休眠,所有Item子類已經保存,所以它應該使用它們。

任何幫助。謝謝

+1

將代碼發佈到構建和保存新菜單的位置。 –

+0

@AlanHay即使你的評論真的很一般,它可以幫助我找到我的錯誤。我通過在我的項目列表中添加一個新項目來完成我的測試,我沒有從數據庫加載它們,所以它們的id在'null'! .....我的錯誤[-_-] – akuma8

+0

當子obj(映射對象)爲空時,通常會得到這個問題 – soorapadman

回答

0

您可能需要使用多對多關係,如果您想要從菜單中刪除項目而不是從所有菜單中刪除項目,這也會提供更大的靈活性。

菜單< - >菜單項< - >項目

的新菜單項實體將有兩個菜單和項目的主鍵。

Many to Many example

+0

我的子實例(子類)已經持久化了。所以我不想再堅持下去。我只想堅持一個沒有級聯的'Menu',因爲它們已經存在。 – akuma8

相關問題