JPA:获取双向多对一关系

Posted

技术标签:

【中文标题】JPA:获取双向多对一关系【英文标题】:JPA: fetching bidirectional many to one relationship 【发布时间】:2013-08-28 20:59:15 【问题描述】:

我是 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 特有的。

【问题讨论】:

如果你只想要父母而你有孩子,你可以说FROM Parent p WHERE p.id = :parent_id 我希望孩子和父母在一个查询/交易中进行 【参考方案1】:

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

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

    如果您在数据库中的对象上使用 JPA 注释 select c from Child cchild.getParent() 就足够了。

【讨论】:

我正在寻找一种方法在一个查询中获取孩子和它的父母,即作为一个连接。您在第 2 点建议的解决方案执行两个单独的查询。【参考方案2】:

您需要在 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 'children' 中包含来自子表的关联数据

【讨论】:

这没什么区别 我不知道为什么它没有做出任何改变,但我尝试过这种方式它对我有用。【参考方案3】:

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

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

【讨论】:

以上是关于JPA:获取双向多对一关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中一对多和多对一关系

hibernate中配置单向多对一关联,和双向一对多

jpa多个双向多对一关系到同一字段

hibernate多对一关联映射两种形式的理解

重复条目异常:Spring Hibernate/JPA 级联保存多对一

如何让jpa休眠创建具有多对一但没有外键的实体