不重複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
子類已經保存,所以它應該使用它們。
任何幫助。謝謝
將代碼發佈到構建和保存新菜單的位置。 –
@AlanHay即使你的評論真的很一般,它可以幫助我找到我的錯誤。我通過在我的項目列表中添加一個新項目來完成我的測試,我沒有從數據庫加載它們,所以它們的id在'null'! .....我的錯誤[-_-] – akuma8
當子obj(映射對象)爲空時,通常會得到這個問題 – soorapadman