2011-04-22 63 views
0

我必須用EclipseLink實現父子樹。@ManyToOne關係從未讀取

下面的代碼編譯好的,合理的DDL代碼是自動生成的,但孩子領域始終解析爲空集,並跟蹤顯示,沒有查詢過執行填補了這一領域。

@Entity 
public class TreeNode { 
    @Id @GeneratedValue 
    private int id; 

    private TreeNode parent; 

    @OneToMany(mappedBy="parent") 
    private Set<TreeNode> children; 
} 
+0

你可以把填充孩子的代碼? – 2011-04-22 17:12:43

+0

public void addNode(TreeNode child){child.parent = this; getChildren()。add(child); emf.persist(child); } – Vladimir 2011-04-22 17:25:34

+0

填充數據庫的代碼工作得很好:我可以通過純SQL讀取有問題的對象。奇怪的是程序沒有發出任何查詢:-( – Vladimir 2011-04-22 17:28:59

回答

0

ADDNODE似乎堅持的孩子,但如果不是在管理父工作時,將需要合併,這樣的變化對集合被存儲以及父。否則,對父進行的更改不會存儲在緩存中,因此它將不會顯示任何更改,直到從數據庫刷新爲止。

0

事實上,真正的階級結構不是那麼簡單,這是問題的EclipseLink來源:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
abstract class TreeNode { 
    @Id int id; 
    private TreeNode parent; 

    @OneToMany(mappedBy="parent") 
    private Set<TreeNode> children; 
} 

abstract class NamedNode extends TreeNode { String name, title; } 

class ConcreteNode1 extends NamedNode { ... some concrete fields } 
class ConcreteNode2 extends NamedNode { ... some concrete fields } 
.... 

只有ConcreteNodeXXX類應該被實例化,所有的人都應該繼承的姓名和頭銜來自抽象NamedNode類的字段。 EclipseLink不會投訴,但無法處理從多個表中讀取孩子。所以最終,我轉向了Hibernate,到目前爲止它處理這個結構的能力很強。

+0

你提到它並不是爲孩子們查詢,所以我不明白爲什麼這會受到繼承的影響 - 它似乎還有更多與使用二級緩存的EclipseLink有關。你可以嘗試刷新實體嗎?如果孩子們仍然沒有閱讀,請用EclipseLink提交錯誤,否則,如果需要,可以禁用緩存,或通過合併所述更改來保持一致。 – Chris 2011-04-26 15:21:23

+0

我剛啓動程序,使用查詢讀取父對象,並探索了子插槽。它包含一個單元集合,只要我調用任何集合方法而不執行任何數據庫操作,它就會變成空集合。順便說一句,如果我讀了假想的孩子與另一個查詢,他們都在父母字段中爲NULL :-( – Vladimir 2011-04-27 14:33:19