Как исправить самое распространенное исключение LazyInitializationException - Hibernate JPA - PullRequest
0 голосов
/ 16 февраля 2020

Я борюсь с 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 я могу получить Order с помощью objectDetail.getOrder (). Более того: я не могу использовать Eager loading из-за того, что я использую его в другом объекте.

Вот мой класс 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;
}

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, загружаются по умолчанию с отложенной загрузкой, так почему он не загружает мои OrderDetails, когда я выполняю .getOrderDetails ()?

Буду очень признателен за любую помощь! PS. Я начинающий, поэтому, если я не объяснил что-то достаточно хорошее, не стесняйтесь задавать вопросы.

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Используйте это

@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);
}
0 голосов
/ 28 марта 2020

Я решил эту проблему. Я запускал все в CommandLineRunner. «Ленивое исключение» исчезло, когда я начал делать тесты, в которых вместо «пробовал что-то» в основном классе.

Мой основной класс выглядел так:

 @Bean
 public CommandLineRunner bookDemo(OrderDao orderDao, PriceDao priceDao, ProductDao productDao,
                                   OrderService orderService, InvoiceDao invoiceDao, InvoiceService invoiceService) {
                                   OrderService orderService, InvoiceDao     invoiceDao, InvoiceService invoiceService,
                                   ReportService reportService) {
     return (args) -> {

         List<Order> orders = orderDao.findByBuyerId(1L);

         for (Order order : orders) {
             orderService.payForOrde(order);
         }
...