2011-04-22 76 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