JPA:获取双向多对一关系

时间:2013-08-28 20:59:16

标签: java jpa orm jpql datanucleus

我是JPA / JPQL的初学者,当我建立双向关系时,我遇到了多对一关系的问题。这是JPQL:

select c from Child c join fetch c.parent

以下是两个简单的类:

@Entity
public class Parent {
    @Id
    private int id;

    private String title;

    @OneToMany(mappedBy = "parent")
    private Set<Child> children;
}
@Entity
public class Child {

    @Id
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    private Parent parent;

}

datanucleus执行的等效SQL查询是:

SELECT 'com.*.Child' AS NUCLEUS_TYPE,`C`.`ID`,`C`.`PARENT_ID` FROM `CHILD` `C` INNER JOIN `PARENT` `B0` ON `C`.`PARENT_ID` = `B0`.`ID`

现在,如果我在Parent中完全删除对“children”的引用,那么SQL正是我所需要的:

SELECT 'com.*.Child' AS NUCLEUS_TYPE,`C`.`ID`,`B0`.`ID`,`B0`.`TITLE` FROM `CHILD` `C` INNER JOIN `PARENT` `B0` ON `C`.`PARENT_ID` = `B0`.`ID`


要明确:我想要实现的是使用我的JPQL查询来获取孩子的父级。

更新:我刚刚使用EclipseLink尝试了这两个类,这样可行,所以看起来这个问题是Datanucleus特有的。

3 个答案:

答案 0 :(得分:0)

  1. 您需要@JoinColumn来创建双向关系:

    @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name =“parent_id”) 私人父母;

  2. 如果您对数据库中的对象使用JPA注释select c from Child c而不是child.getParent()就足够了。

答案 1 :(得分:0)

您需要在Child类中使用@JoinColumn并尝试此操作。

父:

@OneToMany(targetEntity = Child.class, fetch = FetchType.EAGER, mappedBy = "parent", cascade=CascadeType.ALL)

子:

@ManyToOne(targetEntity=Parent.class, fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="id", nullable = false)

当您从父表中获取数据时,它将自动包含Set'child'中子表的关联数据

答案 2 :(得分:0)

没关系,这是一个Datanucleus bug。它已在datanucleus-rdbms-3.2.6中修复。这是修复的提交:

http://sourceforge.net/p/datanucleus/code/18118/