Java 使用具有OneToMany的JoinTable的MultipleBagFetchException?

Java 使用具有OneToMany的JoinTable的MultipleBagFetchException?,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个单向的一对多关系,但在两个表之间有一个联接表。例如: 父表(客户): 联接表(客户到电话): 儿童桌(电话): 显然,从SQL的角度来看,您可以执行以下操作: select C.NAME, P.AREA_CODE, P.NUMBER from CUSTOMER C, CUSTOMER_TO_PHONE CTP, PHONE P where C.ID = CTP.CUST_ID and CTP.PHONE_ID = P.ID; 从JPA的角度来看,我试图创建它,这样我就不必为联接表创建实

我有一个单向的一对多关系,但在两个表之间有一个联接表。例如:

父表(客户):

联接表(客户到电话):

儿童桌(电话):

显然,从SQL的角度来看,您可以执行以下操作:

select C.NAME, P.AREA_CODE, P.NUMBER
from CUSTOMER C, CUSTOMER_TO_PHONE CTP, PHONE P
where C.ID = CTP.CUST_ID and CTP.PHONE_ID = P.ID;
从JPA的角度来看,我试图创建它,这样我就不必为联接表创建实体类,因此我尝试使用
@JoinTable
。以下是我的尝试:

@Entity @Table(name = "CUSTOMER")
public class Customer {

    @Id
    private long id;

    private String name;

    @JoinTable(
        name = "CUSTOMER_TO_PHONE",
        joinColumns = @JoinColumn(name = "CUST_ID", referencedColumnName = "ID"),
        inverseJoinColumns = @JoinColumn(name = "PHONE_ID", referencedColumnName = "ID"))
    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true)
    private List<Phone> phoneNumbers;
}

@Entity @Table(name = "PHONE")
public class Phone {

    @Id
    private long id;

    @Column(name = "AREA_CODE")
    private int areaCode;

    private int number;
}
@Entity@Table(name=“CUSTOMER”)
公共类客户{
@身份证
私人长id;
私有字符串名称;
@可接合(
name=“客户到电话”,
joinColumns=@JoinColumn(name=“CUST\u ID”,referencedColumnName=“ID”),
inverseJoinColumns=@JoinColumn(name=“PHONE\u ID”,referencedColumnName=“ID”))
@OneToMany(fetch=FetchType.EAGER,orphan=true)
私人电话号码列表;
}
@实体@Table(name=“PHONE”)
公用电话{
@身份证
私人长id;
@列(名称=“区域代码”)
私人国际区号;
私有整数;
}
然而,当我尝试加载
EntityManager
时,这给了我一个可爱的例外:
org.hibernate.loader.MultipleBagFetchException:无法同时提取多个行李


我做错了什么?我没看见。由于它是单向的,我不认为电话需要某种形式的客户参考。

我使用的是
EntityManager.find(Customer.class,1)尝试获取客户。没有自定义的HQL。创建
EntityManager
时会发生异常。这些实体是否有其他集合属性?实际上,我收回了这一点。在我的真实代码中,有一系列两个联接表。。。所以,table->join table->child->join table->孙子。我删除了第一个child中的第二个JoinTable,它能够做到这一点。我怎样才能让它对孙子孙女也这么做呢?它必须是一个懒惰的获取吗?是的,您不能同时获取多个包。所以其他人应该懒惰。但同样,看起来您有@manytomy关系,我会更改注释。要么您将fetch加入到一个包中,要么您使用集合而不是列表。
+----+-----------+--------+
| ID | AREA_CODE | NUMBER |
+----+-----------+--------+
select C.NAME, P.AREA_CODE, P.NUMBER
from CUSTOMER C, CUSTOMER_TO_PHONE CTP, PHONE P
where C.ID = CTP.CUST_ID and CTP.PHONE_ID = P.ID;
@Entity @Table(name = "CUSTOMER")
public class Customer {

    @Id
    private long id;

    private String name;

    @JoinTable(
        name = "CUSTOMER_TO_PHONE",
        joinColumns = @JoinColumn(name = "CUST_ID", referencedColumnName = "ID"),
        inverseJoinColumns = @JoinColumn(name = "PHONE_ID", referencedColumnName = "ID"))
    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true)
    private List<Phone> phoneNumbers;
}

@Entity @Table(name = "PHONE")
public class Phone {

    @Id
    private long id;

    @Column(name = "AREA_CODE")
    private int areaCode;

    private int number;
}