2014-06-18 46 views
0

基本上我的問題是爲什麼如果我有這樣的Hibernate關係。自動休眠保存關係

@OneToMany(cascade = {CascadeType.ALL}) 
@JoinColumn(name = "candidacy_id", nullable = false) 
@XmlElement 
@JsonIgnore 
@Getter 
@Setter 
private List<EvaluationSelectionCriteria> evaluationSelectionCriterias = new ArrayList<>(); 

    @ManyToOne 
    @JoinColumn(name = "candidacy_id", nullable = false, insertable = false, updatable = false) 
    @XmlTransient 
    @Getter 
    @Setter 
    private Candidacy candidacy; 

爲什麼如果我這樣做candidacy.setEvaluationSelectionCriteria(名單)自動此列表中的數據庫持久?

我想用EvaluationSelectionCriteria作爲存儲庫來呈現「未來」 EvaluationSelectionCriteria

的名單可能是因爲不是懶惰?

更多細節解釋

所以會像我所說的方法,有I'm從數據庫實體中得到那麼我設置列表分爲A,然後我的方法返回A,但我可不是節約A,當我看到列表的值已經有了ID!

回答

2

如果你不想當父實體被保存到保存列表/合併,您應該刪除或限制級聯設置的關係:

@OneToMany 
private List<EvaluationSelectionCriteria> evaluationSelectionCriterias 

@OneToMany(cascade = CascadeType.REMOVE) // or other values from the enum 
private List<EvaluationSelectionCriteria> evaluationSelectionCriterias 

編輯:如果您想要在事務性方法中獲取實體並對其進行修改,您可以將事務範圍限制爲僅提取。然後修改事務方法之外的實體。稍後,您可以根據需要合併分離的實體。

由於集合屬性是每默認懶惰的,你要麼需要

  • 訪問他們的內容,同時仍然在事務性方法裏 - 這樣的集合可以從數據庫中獲取。請注意,您必須調用收集的方法,實際上需要加載內容,例如getCriterias().size()

  • 使用LEFT JOIN FETCH加載集合作爲查詢的副作用。

我不會修改FlushMode的會議 - 而這可能會工作,感覺就像一個雜牌組裝電腦 - 它不傳達您的意圖非常好。明確提取集合並在事務外修改它會更好地表達您的意圖IMO。

+0

+1但我不明白問題的第二部分 –

+0

我的猜測是列表的內容應該只保存到數據庫中。如果沒有級聯,OP將不得不先保存列表中的元素。 – kostja

+0

不,沒有那個部分是清楚的。這裏奇怪的是我沒有保存實體。我只是將列表設置到實體中,然後返回實體但我不保存。唯一的問題是我的整個服務都是交易性的,但是在任何時候我都會保存這個實體。所以會像我打電話給方法a,那裏我從數據庫實體A獲得,然後我將一個列表設置爲A,然後我在方法中返回A,但是我不保存A,當我看到列表的值時有ids !!! – paul

0

我找到了解決方案,我忘了說我正在使用Spring,所以最後我將@Transactional(readOnly = true)添加到我的方法中,而不是在服務類級別中。