gpt4 book ai didi

java - Hibernate : org. hibernate.loader.MultipleBagFetchException: 无法同时获取多个包

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:38 24 4
gpt4 key购买 nike

实体类

客户

       @Entity
@Table(name="Custumer")
public class Custumer implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@Column(name="name",unique = true)
private String name;
@Column(name="Email",unique = true)
private String Email;
@Column(name = "Coins")
private Double coins;

@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)

private List<ShippingAdress> shippingAdress = new ArrayList<ShippingAdress>();


@OneToMany( fetch = FetchType.EAGER, mappedBy = "custumer", cascade = CascadeType.ALL,orphanRemoval = true)

private List<Order> orders= new LinkedList<Order>();
//...

送货地址

    @Entity
@Table(name="ShippingAdress")
public class ShippingAdress implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@Column(name="postCode")
private String PostCode;
@Column(name="street")
private String street;
@Column(name="house")
private String house;
@Column(name="flat")
private String flat;

@ManyToMany(mappedBy = "shippingAdress")
private List<Custumer> custumers = new LinkedList<Custumer>();
//...

项目

@Entity
@Table(name="Items")
public class Items implements Serializable,Comparable<Items> {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

@Column(name="id")
private Long id;
@Column(name="name", unique = true)
private String name;
@Column(name="price")
private double price;
@Column(name="count")
private int count;

@OneToMany(mappedBy = "item", cascade = CascadeType.ALL,orphanRemoval = true)
List<Order> orders = new LinkedList<Order>();
//...

客户订单

@Entity
@Table(name = "CustumerOrder")
public class Order implements Serializable {
@Id
@ManyToOne
private Custumer custumer;


@Id
@ManyToOne

private Items item;

当我试图获得特定客户的所有订单时

  public List<Order> getOrderByCustumerId(Custumer custumer) {

Criteria criteria = session.createCriteria(Order.class);
List<Order> res = (List<Order>) criteria.add(Restrictions.eq("custumer",custumer)).list();

return res;
}

我面临以下异常:

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

如果从它们存在的地方之一删除 fetch = FetchType.EAGER得到以下内容:(应该从客户中删除)

   org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.CoinsShop.DataBase.DataSets.Custumer.shippingAdress, could not initialize proxy - no Session

数据库中的关系

database relations

最佳答案

正如异常告诉你的,你不能同时获取两个相关的集合或包。一种快速的解决方案是从一个集合中删除 FetchType.EAGER 并强制获取显式调用集合对象的集合。

例如,如果您从 shippingAddress 集合中删除 FetchType.EAGER,您可以像这样强制获取:

public List<Order> getOrderByCustomerId(Customer customer) {
Criteria criteria = session.createCriteria(Order.class);
List<Order> res = (List<Order>) criteria.add(Restrictions.eq("customer",customer)).list();

for (Order order : res)
order.getCustomer().getShippingAddress().size();

return res;
}

调用集合的 size() 方法将强制获取该集合的所有元素。

有关此主题的更多信息:

Hibernate cannot simultaneously fetch multiple bags

关于java - Hibernate : org. hibernate.loader.MultipleBagFetchException: 无法同时获取多个包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37282850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com