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

标签 java spring hibernate jpa lazy-initialization

我正在与 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 。 更重要的是:我无法使用预加载,因为我正在另一个实体中使用它。

这是我的订单类:

@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;
}

订单道:

@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);
}

和订单详细信息:

@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 ?

如果有任何帮助,我将非常感激! 附言。我是初学者,所以如果我没有解释得足够好,请不要犹豫提出一些问题。

最佳答案

使用这个

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

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

关于java - 如何修复最常见的 LazyInitializationException - Hibernate JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249444/

相关文章:

java - Spring - 使用注释设置属性值而不使用属性文件

java - 线性 RGB 空间中的仿射变换

java - 根据浮点值对对象数组进行排序

Java 最快的 OffsetDateTime 解析器

java - ajax成功函数出错

java - 2个表之间的Quarkus/Hibernate关系

java - 什么是 NullPointerException,我该如何解决?

java - Spring "session"bean 范围

hibernate - grails数据完整性违规异常及原因?

java - 防止 hibernate 刷新只读操作