2017-08-24 31 views
2

我想其中有孩子實體的集合(childHistory),也是一個指針,最後添加的孩子(currentChild)映射到一個子表兩次 - @OneToMany和@ManyToOne

class Parent { 
    //unidirectional 
    @OneToOne(cascade = CascadeType.PERSIST, optional = false) 
    @JoinColumn(name = "current_child_id") 
    private Child currentChild; 

    //bidirectional 
    @OneToMany(mappedBy = "parent") 
    private List<Child> childHistory; 

    public Parent() { 
     currentChild = new Child(this); 
     childHistory = new ArrayList<>(); 
     childHistory.add(currentChild); 
    } 

    public void add() { 
     currentChild = new Child(this); 
     childHistory = new ArrayList<>(); 
     childHistory.add(currentChild); 
    } 
} 

class Child { 
    @ManyToOne(optional = false) 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 
    public Child(Parrent parent) { 
     this.parent = parent; 
    } 
} 
父實體模型

當我嘗試保存父級(並依靠級聯來堅持子級)時,我目前得到了暫時實體的異常。由於我在Parent ctor中啓動了所有內容,因此我無法事先保存Parent。

警告(即導致異常...):

警告:HHH000437:試圖保存有未保存的瞬態實體 非空的關聯的一個或多個實體。未保存的臨時實體必須在保存這些依賴實體之前的操作中保存。未保存的臨時實體:([com.Parent#<null>]) 相關實體:([[com.Child#<null>]])非空的 協會(S):([com.Child.entity])


警告:HHH000437:試圖保存有 非空的關聯的一個或多個實體與未保存的瞬態實體。未保存的臨時實體必須在保存這些依賴實體之前的操作中保存。未保存的臨時實體:([com.Child#<null>]) 相關實體:([[com.Parent#<null>]])非空的 協會(S):([com.Parent.currentChild])

有沒有一種方法來正確模擬這一點,並有休眠NOT NULL數據庫列。

編輯:對於一個攝製看到這個要點:https://gist.github.com/jlogar/2da2237640aa013f2cfbda33a4a5dc84

+0

你如何保存你的實體 –

+0

'em.persist(新父());' 我省略了一些給定的細節(id,entitymanager,...) –

+1

你可以分享你的服務 –

回答

0

唯一的例外是指的節約臨時實體,這意味着你要保存它與非託管實體關係實體,因爲你的父母是級聯onetoone孩子那麼問題將與childHistory,因爲這是一個雙向的關係,這將使因爲級聯孩子也

@OneToMany(mappedBy = "parent",cascade=CascadeType.PERSIST) 
private List<Child> childHistory; 
+0

不是問題 - 錯誤不是NRE。現在在問題中修復。 –

+0

@ jl.try現在這應該工作 –

+0

我會嘗試拿出一個示例項目。無論我如何在級聯中移動,我都無法解決問題。 –