如何修复最常见的LazyInitializationException-Hibernate JPA

问题描述 投票:0回答:1

我正在与LazyInitializationException挣扎。到目前为止,我几乎已经阅读了有关该文章的每篇文章,但是不幸的是,我没有找到解决问题的方法。这些解决方案中有许多使用EntityManager或我不使用的东西。我正在通过JPA与数据库连接。

我有几个实体,但是问题仅在于其中两个:Order和OrderDetails。当我从数据库对象Order中获取数据,然后尝试执行order.getOrderDetails()时,出现以下错误:

例外:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tradesystem.order.Order.orderDetails, could not initialize proxy - no Session

但它的工作方式与此相反:从OrderDetails对象中,我可以通过objectDetail.getOrder()获得Order。更重要的是:由于我在另一个实体中使用它,因此无法使用Eager加载。

这是我的订单类别:

@Entity
@Data
@Table(name = "orders")
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long id;

private LocalDate date;

@OneToMany(mappedBy = "order")
private List<OrderDetails> orderDetails;

@ManyToOne
@JoinColumn(name = "buyer_fk")
private Buyer buyer;

@ManyToOne
@JoinColumn(name = "supplier_fk")
private Supplier supplier;
}

OrderDao:

@Repository("orderDao")
public interface OrderDao extends JpaRepository<Order, Long> {

@Query(value = "SELECT * FROM orders " +
        "WHERE MONTH(orders.date) = ?1 AND YEAR(orders.date) = ?2",
        nativeQuery = true)
List<Order> getMonthOrders(int month, int year);
}

和OrderDetails:

@Entity
@Data
@Table(name = "orderDetails")
public class OrderDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_details_id")
private Long id;

private BigDecimal quantity;

private BigDecimal sum;

@ManyToOne
@JoinColumn(name = "order_fk")
private Order order;

@ManyToOne
@JoinColumn(name = "product_fk")
private Product productType;

@OneToOne
@JoinColumn(name = "order_comment_fk")
private OrderComment orderComment;
}

以@Many结尾的关系默认情况下是延迟加载的,为什么当我执行.getOrderDetails()时为什么不加载我的OrderDetails?

我将非常感谢您的帮助!PS。我是乞gg,因此,如果我没有解释足够好的东西,请不要犹豫,提出一些问题。

java spring hibernate jpa lazy-initialization
1个回答
0
投票

使用此

@@ Repository(“ orderDao”)公共接口OrderDao扩展了JpaRepository {

@@(value =“从订单中选择SELECT LEFT JOIN FETCH orders.orderDetails” +“ WHERE MONTH(orders.date)=?1 AND YEAR(orders.date)=?2”)列出getMonthOrders(int month,int year);}

© www.soinside.com 2019 - 2024. All rights reserved.