【发布时间】:2020-02-16 14:23:56
【问题描述】:
我正在与 LazyInitializationException 作斗争。到目前为止,我已经阅读了所有关于此的文章,但不幸的是,我没有找到解决问题的方法。其中许多解决方案使用 EntityManager 或我不使用的东西。我正在通过 JPA 连接我的数据库。
我有几个实体,但问题只是其中两个:Order 和 OrderDetails。 当我从 DB 对象 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() 获得订单。 更重要的是:由于我在另一个实体中使用它,我无法使用 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);
}
和订单详情:
@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。我是初学者,所以如果我解释的不够好,请不要犹豫提出一些问题。
【问题讨论】:
-
你什么时候得到异常?它在服务中吗?控制器?它是事务上下文吗?
-
服务中。不,它不是事务性上下文。
-
你真的有使用原生查询吗?否则你可以使用
left join fetch order.orderDetails -
那么,您究竟提出了什么来代替原生查询呢?
标签: java spring hibernate jpa lazy-initialization