2012-06-20 50 views
2

我有一個這樣的實體:CascadeType.ALL不起作用與FetchType.EAGER

@Entity 
public class Directory extends Node 
{ 
    @OneToMany(cascade= CascadeType.ALL,fetch= FetchType.EAGER) 
    private List<Node> nodes = new ArrayList<Node>(); 
} 

的映射是單向的。

當我使用FethType.EAGER時,級聯選項不起作用。當沒有急切的選項時,這段代碼可以很好地保存這兩個實體。這裏有什麼問題?

public void addDirectory(String name, long directoryId, User owner) 
{ 
    Directory parent = entityManager.find(Directory.class, directoryId); 
    Directory dir = new Directory(name,owner); 
    parent.add(dir); 
    owner.incrementRevision(); 
    entityManager.merge(owner); 
} 

parent.add()只是將實體添加到集合中。

public boolean add(Node e) 
{ 
    return nodes.add(e); 
} 
+0

什麼是用戶類CascadeType?我沒有看到你堅持目錄的位置。 – Pace

+0

該目錄正在添加到已級聯設置的父級。因爲在第一行加載父項,所以父項被附加到實體管理器。 – Nefron

+0

當然。父級連接到實體管理器,但除非在父級上調用明確的合併或持久性,否則沒有任何事情可以級聯到子級。 事務關閉時發生的隱式刷新不會自動使子持久化。您必須直接或間接(通過在父母上調用)來調用/堅持孩子,以使子實體持久化。 – Pace

回答

0

也許你應該使用getNodes()。添加,而不是僅僅nodes.add,一些供應商可能會,如果他們使用編織處理您的實體有這種麻煩。