Java JPA:获取双向多对一关系
我是JPA/JPQL的初学者,当我使关系具有双向性时,我在获取多对一关系方面遇到了问题。以下是JPQL:Java JPA:获取双向多对一关系,java,jpa,orm,jpql,datanucleus,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<Ch
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;
}
现在,如果我完全删除父级中对“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特有的
@JoinColumn
来创建双向关系:
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“parent\u id”)
私人家长Child.getParent()
您需要在子类中使用@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)
当您从父表中获取数据时,它将自动包含集合“children”中的子表中的关联数据,这是一个Datanucleus错误。它已在datanucleus-rdbms-3.2.6中修复。这是修复程序的提交:
如果您只想要父对象,并且您有了子对象,您可以从父对象p中说
,其中p.id=:parent_id
我希望子对象和父对象在一个查询/事务中完成。我正在寻找一种方法,在一个查询中获取子对象及其父对象,即作为联接。你在第2点中建议的解决方案执行两个单独的查询。这没有什么区别。我不知道为什么它没有做任何更改,但我已经尝试过这样做,它对我有效。
@ManyToOne(targetEntity=Parent.class, fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="id", nullable = false)